Python开发者 2019-06-21
Pandas 是Python的一个数据分析包,最初由AQR Capital Management于2008年4月开发,并于2009年底开源出来,目前由专注于Python数据包开发的PyData开发team继续开发和维护,属于PyData项目的一部分。Pandas最初被作为金融数据分析工具而开发出来,因此,Pandas为时间序列分析提供了很好的支持。 Pandas的名称来自于面板数据(panel data)和Python数据分析(data analysis)。
>>> import pandas as pd
>>> pd.__version__
'0.24.2'
目前,Pandas 中的数据结构有3 种:Series、DataFrame和Panel。
Series:一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近,其区别是:List中的元素可以是不同的数据类型,而Array和Series中则只允许存储相同的数据类型,这样可以更有效的使用内存,提高运算效率。
DataFrame:二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。Index(行)和columns(列)。
Panel :三维的数组,可以理解为DataFrame的容器。
基本创建方式:
pd.Series(data=None, index=None)
data:传入数据,可以传入多种类型;
index:索引,在不指定index的情况下,默认数值索引 range(0, len(data))。
如下是Series操作示例:
>>> data=[0,1,2]
>>> index=["a","b","c"]
>>> s=pd.Series(data=data, index=index)
>>> s
a 0
b 1
c 2
dtype: int64
>>> s.index
Index(['a', 'b', 'c'], dtype='object')
>>> s.values
array([0, 1, 2], dtype=int64)
>>> s.dtype
dtype('int64')
不指定 index的情况下Series,索引默认为([0,1,2]。
>>> s1=pd.Series(data=data)
>>> s1
0 0
1 1
2 2
dtype: int64
传入字典数据,key 解析为 index,value 解析为 data。
>>> data1={"aa":10,"bb":100,"cc":1000}
>>> s2=pd.Series(data1)
>>> s2
aa 10
bb 100
cc 1000
dtype: int64
基本创建方式
pd.DataFrame(data=None, index=None, columns=None)
DataFrame 既有行索引,也有列索引。
创建DataFrame操作示例:
>>> data=np.arange(6).reshape(2,3)
>>> data
array([[0, 1, 2],
[3, 4, 5]])
>>> index=["a","b"]
>>> columns=["col1","col2","col3"]
>>> df1=pd.DataFrame(data, index, columns)
无行、列索引传入的情况
>>> df2=pd.DataFrame(data)
>>> df2
0 1 2
0 0 1 2
1 3 4 5
(1)构建DataFrame对象
>>> df=pd.DataFrame(np.random.randint(1,10,[5,3]),index=['a','c','e','f','h'],columns=['one','two','three'])
>>> df
one two three
a 1 6 3
c 5 6 6
e 2 9 3
f 5 5 6
h 1 4 1
(2)DataFrame 赋值操作
>>> df.loc["a","one"]=np.nan
>>> df.loc["c","two"]=-99
>>> df.loc["c","three"]=-99
>>> df.loc["a","two"]=-100
>>> df
one two three
a NaN -100 3
c 5.0 -99 -99
e 2.0 9 3
f 5.0 5 6
h 1.0 4 1
增加2列(columns):
>>> df['four']='bar'
>>> df['five']=df['one']>0
reindex 创建行索引,没有的行数据,默认为NaN。
>>> df2=df.reindex(['a','b','c','d','e','f','g','h'])
df2.dropna(axis=0) 删除缺失值所在行(axis=0)或列(axis=1);
df2.fillna(0) 缺失值以 0 填充;
(3)标识和删除重复行
duplicated() 返回bool 向量,其长度为行数,并指示行是否重复。
其中 d/g 行数据全部为 NaN,完全重复,返回 True,其他返回 False。
其中b 行数据也全部为NaN,为什么返回 False呢?这是因为还有一个keep参数,默认为first,表示第一次出现的时候保留,之后的数据标记/删除。
如果将传入参数 keep='last' ,看到 b/d 行返回为 True,g行数据保留。
如果传入参数 keep=False,则表示标记/删除所有重复项。
df2.drop_duplicates(keep='first')
删除重复的行,keep 参数设置为保留第一次出现的行,之后重复行删除。
df2.drop_duplicates('one',keep='first')
针对one列,删除重复行数据,keep参数设置为 first。如下所示,删除了 b/f 行的数据,因为one列存在重复的数据。
计算的时候总共分3步,1到2是第二组......lower: i. 这组数据中的小值 higher: j. 这组数据中的大值,fraction 是第三步中的小数部分,意思是当前这组数据的0到1的分位数
Series是一种类似于一维数组的对象,由一组数据以及一组与之对应的索引组成。 index: 索引序列,必须是唯一的,且与数据的长度相同. 如果没有传入索引参数,则默认会自动创建一个从0~N的整数索引