在使用 pandas 的过程中,经常用到 merge 或者 concat 操作,今小小补习,作笔记于此。
索引:merge
/ concat
参考资料:pandas 数据规整
merge
merge 函数通过 一个或多个键 来将数据集的 行 连接起来。该函数的主要应用场景是针对同一个 主键
存在两张包含不同特征的表,通过该主键的连接,将两张表进行合并。合并之后,两张表的行数没有增加,列数是两张表的列数之和减一。
函数的具体参数为:
1 | merge(left,right,how='inner',on=None,left_on=None,right_on=None, |
on=None
指定连接的列名,若两列希望连接的列名不一样,可以通过left_on
和right_on
来具体指定how='inner'
参数指的是左右两个表主键那一列中存在不重合的行时,取结果的方式:inner表示交集,outer 表示并集,left 和right 表示取某一边。
举例如下:
1 | import pandas as pd |
on='x1'
,即以两个表中的x1为主键进行连接,how='left'
,即是以两个表中merge
函数中左边那个表的行为准,保持左边表行数不变,拿右边的表与之合并。
df3 结果如下:
x1 x2 x3 x4
0 1 2 3 2.0
1 5 6 7 NaN
2 3 9 0 9.0
3 8 0 3 NaN
concat
concat 与其说是连接,更准确的说是拼接。就是把两个表直接合在一起。于是有一个突出的问题,是 横向拼接 还是 纵向拼接,所以 concat 函数的关键参数是 axis
。
函数的具体参数是:
1 | concat(objs,axis=0,join='outer',join_axes=None,ignore_index=False,keys=None,levels=None,names=None,verigy_integrity=False) |
objs
是需要拼接的对象集合,一般为列表或者字典axis=0
是 行拼接,拼接之后行数增加,列数也根据join
来定,join='outer'
时,列数是两表并集。同理join='inner'
,列数是两表交集。
在默认情况下,axis=0
为纵向拼接,此时有:
1 | concat([df1,df2]) <=> df1.append(df2) |
在axis=1 时为横向拼接 ,此时有
1 | concat([df1,df2],axis=1) <=> merge(df1,df2,left_index=True,right_index=True,how='outer') |
举个例子
1 | import pandas as pd |
输出如下:
data1 key data2 key
0 0 a 0 b
1 1 a 1 b
2 2 b 2 c
3 3 b 3 cdata1 key_x data2 key_y
0 0 a 0 b
1 1 a 1 b
2 2 b 2 c
3 3 b 3 c