github.io 有点慢,font-awesome 有点大,
客官麻烦搬条板凳坐一下下,我马上就到!

Pandas 实用手记(concat/merge)

在使用 pandas 的过程中,经常用到 merge 或者 concat 操作,今小小补习,作笔记于此。
索引:merge / concat

参考资料:pandas 数据规整

merge

merge 函数通过 一个或多个键 来将数据集的 连接起来。该函数的主要应用场景是针对同一个 主键 存在两张包含不同特征的表,通过该主键的连接,将两张表进行合并。合并之后,两张表的行数没有增加,列数是两张表的列数之和减一。
函数的具体参数为:

1
2
merge(left,right,how='inner',on=None,left_on=None,right_on=None,
left_index=False,right_index=False,sort=False,suffixes=('_x','_y'),copy=True)
  • on=None 指定连接的列名,若两列希望连接的列名不一样,可以通过 left_onright_on 来具体指定
  • how='inner' 参数指的是左右两个表主键那一列中存在不重合的行时,取结果的方式:inner表示交集,outer 表示并集,left 和right 表示取某一边。

举例如下:

1
2
3
4
5
6
import pandas as pd
df1 = pd.DataFrame([[1,2,3],[5,6,7],[3,9,0],[8,0,3]], columns=['x1','x2','x3'])
df2 = pd.DataFrame([[1,2],[4,6],[3,9]], columns=['x1','x4'])

df3 = pd.merge(df1, df2, how='left', on='x1')
print(df3)
  • 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
2
3
4
5
6
7
import pandas as pd

df1 = pd.DataFrame({'key': ['a','a','b','b'], 'data1': range(4)})
df2 = pd.DataFrame({'key': ['b','b','c','c'], 'data2': range(4)})

print(pd.concat([df1, df2],axis=1))
print(pd.merge(df1, df2, left_index=True, right_index=True, how='outer'))

输出如下:

data1 key data2 key
0 0 a 0 b
1 1 a 1 b
2 2 b 2 c
3 3 b 3 c

data1 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

回到目录



————  EOF  ————