8.2 合并数据集
pandas对象中的数据可以通过一些方式进行合并:
pandas.merge
根据一个或多个键将不同DataFrame中的行连接起来。(它实现的就是数据库的join操作)。pandas.concat
可以沿着一条轴将多个对象堆叠到一起。combine_first
可以将重复数据编接在一起,用一个对象中的值填充另一个对象中的缺失值。
8.2.1 数据库风格的DataFrame合并
数据集的合并或连接运算是通过一个或多个键将行链接起来的。
pandas的merge
函数是主要切入点。
merge
函数,如果没有指定用哪个列进行连接,就会将重叠列的列名当作键。
pd.merge(df1,df2,on='key')
如果两个对象的列名不同,可以分别指定。
#使用left_on,right_on
pd.merge(df1,df2,left_on='data1',right_on='data2')
merge
做的是“内连接”,结果中的键是交集。外连接求取的是键的并集,组合了左连接和右连接的效果。例如:
pd.merge(df1,df2,how='outer')
两个对象中缺失的值表示为NaN。
how的选项:
上面是多对一的情况,多对多连接产生的是行的笛卡尔积。
对于合并运算需要考虑的一个问题是对重复列名的处理。merge
有一个suffixes
选项,用于指定附加到左右两个DataFrame对象的重叠列名上的字符串。
merge
函数的参数:
8.2.2 索引上的合并
当DataFrame中的连接键位于其索引中,可以传入left_index=True或right_index=True(或两个都传),以说明索引应该被用作连接键。
例如:
pd.merge(left1,right1,left_on='key',right_index=True,how='outer')
对于层次化索引的数据,索引的合并默认是多键合并:
lefth=pd.DataFrame({'key1':['ohio','ohio','ohio','nevada','nevada'],
'key2':[2000,2001,2002,2001,2002],
'data':np.arange(5.)})
righth=pd.DataFrame(np.arange(12).reshape((6,2)),index=[['nevada','nevada','ohio','ohio','ohio','ohio'],
[2001,2000,2000,2000,2001,2002]],
columns=['event1','event2'])
pd.merge(lefth,righth,left_on=['key1','key2'],right_index=True,how='outer')
join
方法:实现按索引合并;可用于合并多个带有相同或相似索引的DataFrame对象,但要求没有重叠的列。DataFrame的join方法默认使用的是左连接,保留左边表的行索引。
left1.join(right1,on='key')
8.2.3 轴向连接
另一种数据合并运算,也被称作连接、绑定、堆叠。
1. NumPy的concatenation
函数可以用NumPy数组实现。
例如:
arr=np.arange(12).reshape((3,4))
#沿轴1连接
np.concatenate([arr,arr],axis=1)
即,将两个矩阵沿轴进行连接。
2. pandas的concat
函数可以实现数组的连接运算。
concat
是在axis=0上工作的,产生一个新的Series。如果传入axis=1,结果会变成一个DataFrame。
8.2.4 合并堆叠数据
对于有索引全部或部分堆叠的两个数据集。
用传递对象中的数据为调用对象的缺失数据”打补丁“。