这里还是先给出官方文档。
我们使用以下几个库,后面就不再重述。
>>>import pandas as pd
>>>import numpy as np
>>>import matplotlib.pyplot as plt
创建一列数据
>>>s = pd.Series([1,2,3,4,5,6])
>>>print (s)
0 1
1 2
2 3
3 4
4 5
5 6
dtype: int64
创建DataFrame
>>>df = pd.DataFrame(np.arange(12).reshape(3,4),index=['A','B','C'], columns=['1','2','3','4']
>>>print(df)
1 2 3 4
A 0 1 2 3
B 4 5 6 7
C 8 9 10 11
我们也可以用元组的形式,这里给出官方的例子:
>>>names = ['Bob','Jessica','Mary','John','Mel']
>>>births = [968, 155, 77, 578, 973]
>>>BabyDataSet = list(zip(names, births))
>>>df = pd.DataFrame(BabyDataSet, columns=['names','births'])
以上结果我们也可以通过字典的形式来输入:
>>>names = ['Bob', 'Jessica', 'Mary', 'John', 'Mel']
>>>births = [968, 155, 77, 578, 973]
>>> df = pd.DataFrame({'names': names, 'births': births})
这里print出的结果列的顺序是births在前,names在后,如果我们希望改一下可以用:
df = df.ix[:, ['names', 'births']]
关于这个索引方法后续会介绍。
df有一些常用的属性:
df.values 返回df的值
df.index 返回行标签
df.columns 返回列标签
df.describe() 返回统计信息
df.T 行列互换
排序:
关于pandas的排序,有两种方法,一种是基于标签,一种是基于值,还是上面那个例子:
>>>names = ['Bob', 'Jessica', 'Mary', 'John', 'Mel']
>>>births = [968, 155, 77, 578, 973]
>>> df = pd.DataFrame({'names': names, 'births': births})
>>>print(df)
births names
0 968 Bob
1 155 Jessica
2 77 Mary
3 578 John
4 973 Mel
>>>print(df.sort_index(axis=1,ascending=False))
names births
0 Bob 968
1 Jessica 155
2 Mary 77
3 John 578
4 Mel 973
>>>print(df.sort_values(by='births'))
births names
2 77 Mary
1 155 Jessica
3 578 John
0 968 Bob
4 973 Mel
df.sort_index(axis,ascending)
axis 的值为0或1,分别表示对行或对列进行排序, ascending为True则为顺序,False为倒序
df.sort_values(by,axis,ascending) by则是按哪一行/列进行排序, 后两者和index排序方法相同。
#索引:
按列索引:
>>>print(df['births'])
0 968
1 155
2 77
3 578
4 973
Name: births, dtype: int64
按行索引:
>>>print(df[0:1])
births names
0 968 Bob
loc标签索引:
>>>print(df.loc[0:1])
births names
0 968 Bob
1 155 Jessica
>>>print(df.loc[0:2,['births']])
births
0 968
1 155
2 77
如果直接print(df.loc['births']) 则会报错,提示KeyError: "None of ['births'] are in the [index]"
如果我们希望用loc来显示出这一列可以用df.loc[:,'births'] 。
iloc 数字索引:
因为默认的index是0~5,为了防止混淆,我们改了一下index
>>>df.index=['A','B','C','D','E']
>>>print(df)
births names
A 968 Bob
B 155 Jessica
C 77 Mary
D 578 John
E 973 Mel
>>>print(df.iloc[0,0])
968
>>print(df.iloc[:,0])
A 968
B 155
C 77
D 578
E 973
Name: births, dtype: int64
>>print(df.iloc[[1,3],1])
B Jessica
D John
Name: names, dtype: object
可见这里我们并不是直接使用标签的名称来进行索引,而是通过其标签所对应的数字。
ix 混合索引:
>>>print(df.ix[[1,3],1])
B Jessica
D John
Name: names, dtype: object
>>>print(df.ix[[1,3],'names'])
B Jessica
D John
Name: names, dtype: object
这时我们既可以使用标签也可以使用数字,还可以混合两种方法,但是容易产生混淆,不建议使用。
按值索引:
>>>print(df[df.births>200])
births names
A 968 Bob
D 578 John
E 973 Mel
这里df.births>200返回一个 <class 'pandas.core.series.Series'>类, 里面包含着[True,False,False,True,True]
>>>print(df[[True,False,False,True,True]])
births names
A 968 Bob
D 578 John
E 973 Mel
数值修改:
>>>df.iloc[:,0]=[555]*5
>>>print(df)
births names
A 555 Bob
B 555 Jessica
C 555 Mary
D 555 John
E 555 Mel
这里给出一个例子,至于loc或者ix方法都是一样的。
添加列:
>>>df['ID']=np.arange(5)
>>>print(df)
births names ID
A 968 Bob 0
B 155 Jessica 1
C 77 Mary 2
D 578 John 3
E 973 Mel 4
这里如果你是想添加行的话,可以用df.T先让行列互换,添加完再改回去
数据丢弃:
>>>df.iloc[2,0]=np.nan
>>>print(df.dropna(axis=0,how='any'))
births names ID
A 968.0 Bob 0
B 155.0 Jessica 1
D 578.0 John 3
E 973.0 Mel 4
我们这里将名字为 Mary的births改成了np.nan
df.dropna(axis,how) axis=0为按行丢弃,1为按列丢弃, how的方法为any (有任何nan的时候就丢弃)和all(全部为nan的时候再丢弃)
面对 nan的数据我们也可以通过
df.fillna(value=)来填充数据。
我们也可以用any来判断是否有nan(或其他值)的数据:
>>>print(df)
births names ID
A 968.0 Bob 0
B 155.0 Jessica 1
C NaN Mary 2
D 578.0 John 3
E 973.0 Mel 4
>>>np.any(df.isnull())== True
True
>>>np.any(df.isin(values=[968])) == True
True
数据合并:
>>>df1 = pd.DataFrame(np.arange(12).reshape(3,4),columns=['a','b','c','d'])
>>>df2 = df1.copy()*1
>>>df3 = df2.copy()*2
>>>r = pd.concat([df1,df2,df3])
>>>print(r)
a b c d
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
0 0 2 4 6
1 8 10 12 14
2 16 18 20 22
0 0 4 8 12
1 16 20 24 28
2 32 36 40 44
这里concat有几个可选参数
axis 默认为0,为0时按列排序,为1时按行排序
join 默认为'outer',如果列标签不一致,会把不存在的元素用nan填充,'inner'则会删除不存在数据的行和列.
join_axes 默认为None 这里我们可以选择index以哪一个的为准
append:
>>>df1 = pd.DataFrame(np.arange(12).reshape(3,4),columns=['a','b','c','d'])
>>>df2 = df1.copy()*1
>>>df3 = df2.copy()*2
>>>df3.columns = ['b','c','d','e']
>>>res = df1.append([df2,df3],ignore_index=True)
>>>print(res)
a b c d e
0 0.0 1 2 3 NaN
1 4.0 5 6 7 NaN
2 8.0 9 10 11 NaN
3 0.0 1 2 3 NaN
4 4.0 5 6 7 NaN
5 8.0 9 10 11 NaN
6 NaN 0 2 4 6.0
7 NaN 8 10 12 14.0
8 NaN 16 18 20 22.0
>>>res1 = pd.concat([df1,df2,df3],join='outer',ignore_index=True)
>>>print(res1)
a b c d e
0 0.0 1 2 3 NaN
1 4.0 5 6 7 NaN
2 8.0 9 10 11 NaN
3 0.0 1 2 3 NaN
4 4.0 5 6 7 NaN
5 8.0 9 10 11 NaN
6 NaN 0 2 4 6.0
7 NaN 8 10 12 14.0
8 NaN 16 18 20 22.0
从中我们可以看出,res和res1的输出是完全一样的,append也就是concat的outer方法。
merge方法:
megre方法可以让我们把DataFrame按照其中的某列合并:
>>>df1 = pd.DataFrame({'K1':['a','b','c','d'],'A':['a1','a2','a3','a4'],'B':['b1','b2','b3','b4']})
>>>df2 = pd.DataFrame({'K1':['b','c','d','e'],'C':['c1','c2','c3','c4'],'D':['d1','d2','d3','d4']})
>>>res = pd.merge(df1,df2,on='K1')
>>>print(res)
A B K1 C D
0 a2 b2 b c1 d1
1 a3 b3 c c2 d2
2 a4 b4 d c3 d3
我们可以看到这里默认的合并方法是'inner'方法,我们可以添加how = 来改变其方法其中可以使用 'inner','outer','left'(以df1的K1为准), 'right'(以df2的K1为准)
考虑K1,K2:
>>>df1['K2']=['1','0','1','0']
>>>df2['K2']=['0','0','1','0']
>>>res = pd.merge(df1,df2,on=['K1','K2'])
>>>print(res)
A B K1 K2 C D
0 a2 b2 b 0 c1 d1
可以看到和只有K1的方法类似,这里依旧默认为'inner',也可以通过改变how = 来改变其方法。
考虑不同的标签,同一个值:
>>>df1 = pd.DataFrame({'LK':['A0','A1','A2','A3'],'K':['1','2','3','4']})
>>>df2 = pd.DataFrame({'RK':['A0','A1','A2','A3'],'K':['2','3','4','5']})
>>>res = pd.merge(df1,df2,left_on='LK',right_on='RK',how='outer')
>>>print(res)
K_x LK K_y RK
0 1 A0 2 A0
1 2 A1 3 A1
2 3 A2 4 A2
3 4 A3 5 A3
当然我们也可以通过更改df2的标签然后把df2按列插入到df1中,不过操作比较繁琐了。
判断某一列是否在df1或者df2中:
>>>df1 = pd.DataFrame({'LK':['A0','A1','A2','A3'],'K':['1','2','3','4']})
>>>df2 = pd.DataFrame({'RK':['A0','A1','A2','A3'],'K':['2','3','4','5']})
>>>res = pd.merge(df1,df2,on='K',how='outer',indicator=True)
print(res)
K LK RK _merge
0 1 A0 NaN left_only
1 2 A1 A0 both
2 3 A2 A1 both
3 4 A3 A2 both
4 5 NaN A3 right_only
这里的indicator='str' 也可以,如果等于True 则会是默认名称 _merge
考虑不是列的名称重合,而是行的名称重合:
>>>df1.index=['K0','K1',"K2",'K3']
>>>df2.index=['K1','K2',"K3",'K4']
>>>res = pd.merge(df1,df2,left_index=True,right_index=True,how='outer')
>>>print(res)
K_x LK K_y RK
K0 1 A0 NaN NaN
K1 2 A1 2 A0
K2 3 A2 3 A1
K3 4 A3 4 A2
K4 NaN NaN 5 A3
可以看到整个数据按照行的标签合并了。
考虑列标签的名字完全重合:
>>>df1 = pd.DataFrame({'A':['A0','A1','A2'],'B':['B1','B2','B3']})
>>>df2 = pd.DataFrame({'A':['A0','A0','A3'],'B':['B3','B4','B5']})
>>>res = pd.merge(df1,df2,how='outer',on='A',suffixes=('_df1','_df2'))
>>>print(res)
A B_df1 B_df2
0 A0 B1 B3
1 A0 B1 B4
2 A1 B2 NaN
3 A2 B3 NaN
4 A3 NaN B5
这里我们以A列为准,suffixes则可以更改on后默认的标签,这里默认的为_x,_y。
最后说一下数据存储:
这里支持很多种格式,具体都有什么大家可以看下官方文档,这里以csv为例:
>>>res.to_csv('res.csv')
读取的话
>>>res1 = read_csv('res.csv')
虽说官方文档之前使用了matplotlab库,碍于篇幅就不介绍了。