文章目录
数据规整
一、分层索引
相当于Excel表中主表头和次表头
data=pd.Series(np.random.randn(9),index=[['a','a','a','b','b','c','c','d','d'],[1,2,3,1,3,1,2,2,3]])
data
1.数组重新排列
data.unstack()#解除原顺序
data.unstack().stack()#复原原顺序
2.设置层级名称
frame=pd.DataFrame(np.arange(12).reshape((4,3)),index=[['b','b','a','a'],[1,2,1,2]],columns=[['ohio','ohio','colorado'],['green','red','green']])
frame.index.names=['key1','key2']
frame.columns.names=['states','color']
frame
3.重排序和层级排序
#交换内外层索引,数据不变
frame.swaplevel('key1','key2')
#对层级索引进行排序,顺序随之变化
frame.sort_index(level=1)#level=0为最外层,1为内层
4.按层级进行汇总统计
frame.sum(level='key2')#按照key2,将索引相同的进行求和
frame.sum(level='color',axis=1)
5.对dataframe重设索引
frame.set_index()#将某列设置为索引,默认从数据中移除这列数据
frame.set_index([''],drop=False)#通过改变drop参数改变上述现象,reset_index将分层索引移入列
二、联合与合并数据集
1.SQL式联合:merge函数
#表格列名重复时,直接按照列名连接
df3=pd.DataFrame({'key':['b','b','a','c','a','a','b'],'data1':range(7)})
df4=pd.DataFrame({'key':['a','b','d'],'data2':range(3)})
pd.merge(df3,df4,on='key')
#表格列名不重复时,需要设置连接列
df1=pd.DataFrame({'lkey':['b','b','a','c','a','a','b'],'data1':range(7)})
df2=pd.DataFrame({'rkey':['a','b','d'],'data2':range(3)})
pd.merge(df1,df2,left_on='lkey',right_on='rkey')
#设置连接方式
pd.merge(df3,df4,on='key',how='left')
#suffixes对重叠列名新建字符串
pd.merge(df3,df4,on='key',suffixes=('_left','_right'))
2.根据索引合并(merge&join)
left1=pd.DataFrame({'key':['a','b','a','a','b','c'],'value':range(6)})
right1=pd.DataFrame({'group_val':[3.5,7]},index=['a','b'])
#左表按照key右表按照索引将两表相连
pd.merge(left1,right1,left_on='key',right_index=True)
#多层索引表相连,将left_on变成数组
pd.merge(left1,right1,left_on['key1','key2'],right_index=True,how='outer')
#join实现连接
left1.join(right1,how='outer',on='key')
#join三表相连,left1为主表
left1.join([right1,another])
3.沿轴向连接(concat)
#concat将值和索引连在一起
s1=pd.Series([0,1],index=['a','b'])
s2=pd.Series([2,3,4],index=['c','d','e'])
s3=pd.Series([5,6],index=['f','g'])
s4=pd.concat([s1,s3])
pd.concat([s1,s2,s3])#默认按照纵轴连接
pd.concat([s1,s2,s3],axis=1)#按照横轴连接
pd.concat([s1,s4],axis=1,join='inner')
pd.concat([s1,s4],axis=1,join_axes=[['a','c','b','e']]#指定用于链接其他轴向的轴
#设置多层索引
result=pd.concat([s1,s2,s3],keys=['one','two','three'])
result
同样的方法可将concat函数应用到dataframe中
**注意:**新版pandas去除了join_axes功能(按索引连接),需要用merge执行相关操作
4.联合重叠数据(where&combine_first)
#where相当于条件判断where(布尔值判断条件,a,b)即当条件成立是返回a,不成立时返回b
a=pd.Series([np.nan,2.5,0.0,3.5,4.5,np.nan],index=['f','e','d','c','b','a'])
b=pd.Series([0,np.nan,2.,np.nan,np.nan,5.],index=['a','b','c','d','e','f'])
np.where(pd.isnull(a),b,a)
#combine_first填充缺失值
a.combine_first(b)