python pandas模块基础学习详解
Pandas类似R语言中的数据框(DataFrame),Pandas基于Numpy,但是对于数据框结构的处理比Numpy要来的容易。
1.Pandas的基本数据结构和使用
Pandas有两个主要的数据结构:Series和DataFrame。Series类似Numpy中的一维数组,DataFrame则是使用较多的多维表格数据结构。
Series的创建
>>>importnumpyasnp >>>importpandasaspd >>>s=pd.Series([1,2,3,np.nan,44,1])#np.nan创建一个缺失数值 >>>s#若未指定,Series会自动建立index,此处自动建立索引0-5 01.0 12.0 23.0 3NaN 444.0 51.0 dtype:float64
DataFrame的创建
>>>dates=pd.date_range('20170101',periods=6) >>>dates DatetimeIndex(['2017-01-01','2017-01-02','2017-01-03','2017-01-04', '2017-01-05','2017-01-06'], dtype='datetime64[ns]',freq='D') >>>df=pd.DataFrame(np.random.randn(6,4),index=dates,columns=['a','b','c','d']) >>>df abcd 2017-01-01-1.9934471.272175-1.578337-1.972526 2017-01-020.092701-0.503654-0.540655-0.126386 2017-01-030.191769-0.578872-1.6934490.457891 2017-01-042.1211200.521884-0.419368-1.916585 2017-01-051.6420630.2221340.108531-1.858906 2017-01-060.6366390.4874910.617841-1.597920
DataFrame可以跟Numpy一样根据索引取出其中的数据,只是DataFrame索引方式更加多样化。DataFrame不仅可以根据默认的行列编号来索引,还可以根据标签序列来索引。
还可以采用字典的方式创建DataFrame:
>>>df2=pd.DataFrame({'a':1,'b':'hellokitty','c':np.arange(2),'d':['o','k']}) >>>df2 abcd 01hellokitty0o 11hellokitty1k
对于DataFrame的一些属性也可以采用相应的方法查看
dtype#查看数据类型 index#查看行序列或者索引 columns#查看各列的标签 values#查看数据框内的数据,也即不含表头索引的数据 describe#查看数据的一些信息,如每一列的极值,均值,中位数之类的,只能对数值型数据统计信息 transpose#转置,也可用T来操作 sort_index#排序,可按行或列index排序输出 sort_values#按数据值来排序
一些例子
>>>df2.dtypes aint64 bobject cint64 dobject dtype:object >>>df2.index RangeIndex(start=0,stop=2,step=1) >>>df2.columns Index(['a','b','c','d'],dtype='object') >>>df2.values array([[1,'hellokitty',0,'o'], [1,'hellokitty',1,'k']],dtype=object) >>>df2.describe#只能对数值型数据统计信息 ac count2.02.000000 mean1.00.500000 std0.00.707107 min1.00.000000 25%1.00.250000 50%1.00.500000 75%1.00.750000 max1.01.000000 >>>df2.T 01 a11 bhellokittyhellokitty c01 dok >>>df2.sort_index(axis=1,ascending=False)#axis=1按列标签从大到小排列 dcba 0o0hellokitty1 1k1hellokitty1 >>>df2.sort_index(axis=0,ascending=False)#按行标签从大到小排序 abcd 11hellokitty1k 01hellokitty0o >>>df2.sort_values(by="c",ascending=False)#按c列的值从大到小排序 abcd 11hellokitty1k 01hellokitty0o
2.从DataFrame中筛选取出目的数据
从DataFrame中取出目的数据方法有多种,一般常用的有:
- -直接根据索引选取
- -根据标签选取(纵向选择列):loc
- -根据序列(横向选择行):iloc
- -组合使用标签序列来选取特定位置的数据:ix
- -通过逻辑判断筛选
简单选取
>>>importnumpyasnp >>>importpandasaspd >>>dates=pd.date_range('20170101',periods=6) >>>df=pd.DataFrame(np.arange(24).reshape((6,4)),index=dates,columns=['a','b','c','d']) >>>df abcd 2017-01-010123 2017-01-024567 2017-01-03891011 2017-01-0412131415 2017-01-0516171819 2017-01-0620212223 >>>df['a']#根据表签直接选取a列,也可用df.a,结果相同 2017-01-010 2017-01-024 2017-01-038 2017-01-0412 2017-01-0516 2017-01-0620 Freq:D,Name:a,dtype:int64 >>>df[0:3]#选择前3行,也可用行标签df['2017-01-01':'2017-01-03'],结果相同,但是无法用此法选择多列 abcd 2017-01-010123 2017-01-024567 2017-01-03891011
loc使用显式的行标签来选取数据
DataFrame行的表示方式有两种,一种是通过显式的行标签来索引,另一种是通过默认隐式的行号来索引。loc方法是通过行标签来索引选取目标行,可以配合列标签来选取特定位置的数据。
>>>df.loc['2017-01-01':'2017-01-03'] abcd 2017-01-010123 2017-01-024567 2017-01-03891011 >>>df.loc['2017-01-01',['a','b']]#选取特定行的a,b列 a0 b1 Name:2017-01-0100:00:00,dtype:int64
iloc使用隐式的行序列号来选取数据
使用iloc可以搭配列序列号来更简单的选取特定位点的数据
>>>df.iloc[3,1] 13 >>>df.iloc[1:3,2:4] cd 2017-01-0267 2017-01-031011
ix利用ix可以混用显式标签与隐式序列号
loc只能使用显式标签来选取数据,而iloc只能使用隐式序列号来选取数据,ix则能将二者结合起来使用。
>>>df.ix[3:5,['a','b']] ab 2017-01-041213 2017-01-051617
使用逻辑判断来选取数据
>>>df abcd 2017-01-010123 2017-01-024567 2017-01-03891011 2017-01-0412131415 2017-01-0516171819 2017-01-0620212223 >>>df[df['a']>5]#等价于df[df.a>5] abcd 2017-01-03891011 2017-01-0412131415 2017-01-0516171819 2017-01-0620212223
3.Pandas设置特定位置值
>>>importnumpyasnp >>>importpandasaspd >>>dates=pd.date_range('20170101',periods=6) >>>datas=np.arange(24).reshape((6,4)) >>>columns=['a','b','c','d'] >>>df=pd.DataFrame(data=datas,index=dates,colums=columns) >>>df.iloc[2,2:4]=111#将第2行2,3列位置的数据改为111 abcd 2017-01-010123 2017-01-024567 2017-01-0389111111 2017-01-0412131415 2017-01-0516171819 2017-01-0620212223 >>>df.b[df['a']>10]=0#等价于df.b[df.a>10]#以a列大于10的数的位置为参考,改变b列相应行的数值为0 abcd 2017-01-010123 2017-01-024567 2017-01-0389111111 2017-01-041201415 2017-01-051601819 2017-01-062002223 >>>df['f']=np.nan#新建f列并设置数值为np.nan abcdf 2017-01-010123NaN 2017-01-024567NaN 2017-01-0389111111NaN 2017-01-041201415NaN 2017-01-051601819NaN 2017-01-062002223NaN >>> #用上面的方法也可以加上`Series`序列,但是必须与列长度一致 >>>df['e']=pd.Series(np.arange(6),index=dates) >>>df abcdfe 2017-01-010123NaN0 2017-01-024567NaN1 2017-01-0389111111NaN2 2017-01-041201415NaN3 2017-01-051601819NaN4 2017-01-062002223NaN5
4.处理丢失数据
有时候我们的数据中会有一些空的或者缺失(NaN)数据,使用dropna可以选择性的删除或填补这些NaN数据。drop函数可以选择性的删除行或者列,drop_duplicates去除冗余。fillna则将NaN值用其他值替换。操作后不改变原值,若要保存更改需重新赋值。
>>>importnumpyasnp >>>importpandasaspd >>>df=pd.DataFrame(np.arange(24).reshape(6,4),index=pd.date_range('20170101',periods=6),columns=['a','b','c','d']) >>>df abcd 2017-01-010123 2017-01-024567 2017-01-03891011 2017-01-0412131415 2017-01-0516171819 2017-01-0620212223 >>>df.iloc[1,3]=np.nan >>>di.iloc[3,2]=np.nan >>>df. abcd 2017-01-01012.03.0 2017-01-02456.0NaN 2017-01-038910.011.0 2017-01-041213NaN15.0 2017-01-05161718.019.0 2017-01-06202122.023.0 >>>df.dropna(axis=0,how='any')#axis=0(1)表示将含有NaN的行(列)删除。 #how='any'表示只要行(或列,视axis取值而定)含有NaN则将该行(列)删除, #how='all'表示当某行(列)全部为NaN时才删除 abcd 2017-01-01012.03.0 2017-01-038910.011.0 2017-01-05161718.019.0 2017-01-06202122.023.0 >>>df.fillna(value=55) abcd 2017-01-01012.03.0 2017-01-02456.055.0 2017-01-038910.011.0 2017-01-04121355.015.0 2017-01-05161718.019.0 2017-01-06202122.023.0
还可以利用函数来检查数据中是否有或者全部为NaN
>>>np.any(df.isnull())==True True >>>np.all(df.isnull())==True False
5.数据的导入以及导出
一般excel文件以csv方式读入,pd.read_csv(file),data保存为filedata.to_csv(file)。
6.数据添加合并
本节主要学习Pandas的一些简单基本的数据添加合并方法:concat,append。
concat合并方式类似于Numpy的concatenate方法,可横向或者竖向合并。
>>>importnumpyasnp >>>importpandasaspd >>>df1=pd.DataFrame(np.ones((3,4))*0,columns=['a','b','c','d']) >>>df2=pd.DataFrame(np.ones((3,4))*1,columns=['a','b','c','d']) >>>df3=pd.DataFrame(np.ones((3,4))*2,columns=['a','b','c','d']) >>>res=pd.concat([df1,df2,df3],axis=0) #axis=0表示按行堆叠合并,axis=1表示按列左右合并 >>>res abcd 00.00.00.00.0 10.00.00.00.0 20.00.00.00.0 01.01.01.01.0 11.01.01.01.0 21.01.01.01.0 02.02.02.02.0 12.02.02.02.0 22.02.02.02.0 >>> #使用ignore_index=True参数可以重置行标签 >>>res=pd.concat([df1,df2,df3],axis=0,ignore_index=True) >>>res abcd 00.00.00.00.0 10.00.00.00.0 20.00.00.00.0 31.01.01.01.0 41.01.01.01.0 51.01.01.01.0 62.02.02.02.0 72.02.02.02.0 82.02.02.02.0
join参数提供了更多样化的合并方式。join=outer为默认值,表示将几个合并的数据都用上,具有相同列标签的合二为一,上下合并,不同列标签的独自成列,原来没有数值的位置以NaN填充;join=inner则只将具有相同列标签的(行)列上下合并,其余的列舍弃。简言之,outer代表并集,inner代表交集**。
>>>importnumpyasnp >>>importpandasaspd >>>df1=pd.DataFrame(np.ones((3,4)),index=[1,2,3],columns=['a','b','c','d']) >>>df2=pd.DataFrame(np.ones((3,4))*2,index=[1,2,3],columns=['b','c','d','e']) >>>res=pd.concat([df1,df2],axis=0,join='outer') >>>res abcde 11.01.01.01.0NaN 21.01.01.01.0NaN 31.01.01.01.0NaN 1NaN2.02.02.02.0 2NaN2.02.02.02.0 3NaN2.02.02.02.0 >>>res1=pd.concat([df1,df2],axis=1,join='outer') #axis=1表示按列左右合并具有相同的行标签的,其余的各成一行,NaN补齐空缺 >>>res1 abcdbcde 11.01.01.01.02.02.02.02.0 21.01.01.01.02.02.02.02.0 31.01.01.01.02.02.02.02.0 >>>res2=pd.concat([df1,df2],axis=0,join='inner',ignore_index=True) #将具有相同列标签的列上下合并 >>>res2 bcd 01.01.01.0 11.01.01.0 21.01.01.0 32.02.02.0 42.02.02.0 52.02.02.0
join_axes参数可以设定参考系,以设定的参考来合并,参考系中没有的舍弃掉
>>>importnumpyasnp >>>importpandasaspd >>>df1=pd.DataFrame(np.ones((3,4)),index=[1,2,3],columns=['a','b','c','d']) >>>df2=pd.DataFrame(np.ones((3,4))*2,index=[2,3,4],columns=['b','c','d','e']) >>>res3=pd.concat([df1,df2],axis=0,join_axes=[df1.columns]) #以df1的列标签为参考上下合并拥有相同列标签的列 >>>res3 abcd 11.01.01.01.0 21.01.01.01.0 31.01.01.01.0 2NaN2.02.02.0 3NaN2.02.02.0 4NaN2.02.02.0 >>>res4=pd.concat([df1,df2],axis=1,join_axes=[df1.index]) #以df1行标签为参考,左右合并拥有相同行标签的各列 abcdbcde 11.01.01.01.0NaNNaNNaNNaN 21.01.01.01.02.02.02.02.0 31.01.01.01.02.02.02.02.0
append只有上下合并,没有左右合并
>>>df1=pd.DataFrame(np.ones((3,4)),index=[1,2,3],columns=['a','b','c','d']) >>>df2=pd.DataFrame(np.ones((3,4))*2,index=[2,3,4],columns=['b','c','d','e']) >>>res5=df1.append(df2,ignore_index=True) >>>res5 abcde 01.01.01.01.0NaN 11.01.01.01.0NaN 21.01.01.01.0NaN 3NaN2.02.02.02.0 4NaN2.02.02.02.0 5NaN2.02.02.02.0
7.Pandas高级合并:merge
merge合并与concat类似,只是merge可以通过一个或多个键将两个数据集的行连接起来。
merge(left,right,how='inner',on=None,left_on=None,right_on=None,left_index=False,right_index=False, sort=False,suffixes=('_x','_y'),copy=True,indicator=False)
参数说明:
- left与right:两个不同的DataFrame
- how:指的是合并(连接)的方式有inner(内连接),left(左外连接),right(右外连接),outer(全外连接);默认为inner
- on:指的是用于连接的列索引名称。必须存在右右两个DataFrame对象中,如果没有指定且其他参数也未指定则以两个DataFrame的列名交集做为连接键
- left_on:左侧DataFrame中用作连接键的列名;这个参数中左右列名不相同,但代表的含义相同时非常有用。
- right_on:右侧DataFrame中用作连接键的列名
- left_index:使用左侧DataFrame中的行索引做为连接键
- right_index:使用右侧DataFrame中的行索引做为连接键
- sort:默认为True,将合并的数据进行排序。在大多数情况下设置为False可以提高性能
- suffixes:字符串值组成的元组,用于指定当左右DataFrame存在相同列名时在列名后面附加的后缀名称,默认为('_x','_y')
- copy:默认为True,总是将数据复制到数据结构中;大多数情况下设置为False可以提高性能
- indicator:显示合并数据中来源情况;如只来自己于左边(left_only)、两者(both)
>>>importpandasaspd >>>df1=pd.DataFrame({'key':['k0','k1','k2','k3'],'A':['a0','a1','a2','a3'],'B':['b0','b1','b2','b3']}) >>>df2=pd.DataFrame({'key':['k0','k1','k2','k3'],'C':['c0','c1','c2','c3'],'D':['d0','d1','d2','d3']}) >>>res=pd.merge(df1,df2,on='key',indicator=True) >>>res ABkeyCD_merge 0a0b0k0c0d0both 1a1b1k1c1d1both 2a2b2k2c2d2both 3a3b3k3c3d3both
依据行index合并与依据列key合并用法类似
>>>res2=pd.merge(df1,df2,left_index=True,right_index=True,indicator=True) >>>res2 ABkey_xCDkey_y_merge 0a0b0k0c0d0k0both 1a1b1k1c1d1k1both 2a2b2k2c2d2k2both 3a3b3k3c3d3k3both
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。