【学习笔记】pandas

这里还是先给出官方文档

我们使用以下几个库,后面就不再重述。

>>>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库,碍于篇幅就不介绍了。


猜你喜欢

转载自blog.csdn.net/Canon__/article/details/79661919
今日推荐