数据规整操作(索引分层、merge合并)

数据规整

一、分层索引

相当于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)

三、重塑和透视

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值