一、数据的合并
pandas对象中的数据可以通过一些内置的方式进行合并:
- pandas.merge可根据一个或多个键将不同DataFrame中的行连接起来。SQL或其他关系型数据库的用户对此应该会比较熟悉,因为它实现的就是数据库的连接操作。
- pandas.concat可以沿着一条轴将多个对象堆叠到一起。
- 实例方法combine_first可以将重复数据编接在一起,用一个对象中的值填充另一个对象中的缺失值。
1.1 merge函数和join函数
相关代码
from pandas import DataFrame
import pandas as pd
#多对一:“多”指的是df1,df1中有多个被标记为a和b的行;“一"指的是df2,df2中key列每个值只对应一行
#两对象存在相同列名时:
df1=DataFrame({'key':['b','b','a','c','a','a','b'],'data1':range(7)})
df2=DataFrame({'key':['a','b','d'],'data2':range(3)})
#没有指定用哪一列进行连接,merge会按照重叠列的列名当键
m1=pd.merge(df1,df2)
#但,最好显式指定一下:
m2=pd.merge(df1,df2,on='key')
#利用join函数
#数据内容与m1/m2相同,但索引与data1相同,这是因为连接方式默认是'left'因此索引与data1一一对应
df1.join(df2.set_index('key'),on='key',how='inner')
#从结果可以看出:c和d以及与之相关的数据都不见了,
#这是因为merge时,默认做的是'inner'连接,结果中的键是交集
#还有'outer','left','right'方式
m3=pd.merge(df1,df2,how='outer')
"""
df1: df2: m1/m2: m3:
data1 key data2 key data1 key data2 data1 key data2
0 0 b 0 0 a 0 0 b 1 0 0.0 b 1.0
1 1 b 1 1 b 1 1 b 1 1 1.0 b 1.0
2 2 a 2 2 d 2 6 b 1 2 6.0 b 1.0
3 3 c 3 2 a 0 3 2.0 a 0.0
4 4 a 4 4 a 0 4 4.0 a 0.0
5 5 a 5 5 a 0 5 5.0 a 0.0
6 6 b 6 3.0 c NaN
7 NaN d 2.0
"""
#当两对象不存在相同列名时,可以进行分别指定:
df3=DataFrame({'lkey':['b','b','a','c','a','a','b'],'data1':range(7)})
df4=DataFrame({'rkey':['a','b','d'],'data2':range(3)})
m4=pd.merge(df3,df4,left_on='lkey',right_on='rkey')
"""
df3: df4: m4:
data1 lkey data2 rkey data1 lkey data2 rkey
0 0 b 0 0 a 0