看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
pandas 提供了 merge()
方法,具有全功能、高性能的内存连接操作,与 SQL 等关系数据库非常相似。这些方法的性能比其他开源实现(如 R 语言中的 base::merge.data.frame
)要好得多(在某些情况下甚至超过一个数量级)。
可以将两个 DataFrame 或者 Series 进行连接:
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,
suffixes=('_x', '_y'), copy=True, indicator=False,
validate=None)
可以实现类似 SQL 的 join 操作,参数为:
left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
pd.merge(left, right, on='key')
on
为两个数据的连接键,都以 key 为标准。
有多个连接键,将两个表按多个关键点(交叉点)连接,默认情况下how=“inner”,会得到一两个数据的交集。
left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
'key2': ['K0', 'K1', 'K0', 'K1'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
'key2': ['K0', 'K0', 'K0', 'K0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
pd.merge(left, right, on=['key1', 'key2'])
key1 和 key2 组合在两个表里共有的会被连接,两个表都有 (k1, k0)
,右表有两个,左表有一个,合并后右表共同了左表的内容。
how
参数可以指定数据用哪种方法进行合并,没有的内容会为 NaN:
# 以左为表基表
pd.merge(left, right, how='left', on=['key1', 'key2'])
# 以右为表基表
pd.merge(left, right, how='right', on=['key1', 'key2'])
# 取两个表的合集
pd.merge(left, right, how='outer', on=['key1', 'key2'])
# 取两个表的交集
pd.merge(left, right, how='inner', on=['key1', 'key2'])
下边是一个有重复连接键的例子:
left = pd.DataFrame({'A': [1, 2], 'B': [2, 2]})
right = pd.DataFrame({'A': [4, 5, 6], 'B': [2, 2, 2]})
pd.merge(left, right, on='B', how='outer')
# 一对多连接
left = pd.DataFrame({'A' : [1,2], 'B' : [1, 2]})
right = pd.DataFrame({'A' : [4,5,6], 'B': [2, 2, 2]})
pd.merge(left, right, on='B', how='outer', validate="one_to_many")
其他的还有:
如果指定,则检查合并是否为指定的类型:
如果设置 indicator 为 True, 则会增加名为 _merge
的一列,显示值的出处,_merge
列有取三个值:
pd.merge(left, right, on='B', how='outer', indicator=True)
'''
A_x B A_y _merge
0 1 1 NaN left_only
1 2 2 4.0 both
2 2 2 5.0 both
3 2 2 6.0 both
'''
df.join(df2) 可以连用对多个数据完成合并拼接:
df.join(df2) # 按索引连接
left.join([right, right2]) # 连接多个表
# 支持的参数 lsuffix/rsuffix 为左右表后缀
df1.join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False)
# df 也有 merge 方法,用法与 pd.merge 相同
left.merge(right, how='inner')
# 按索引连接
pd.merge(left, right, left_index=True, right_index=True, how='inner')
# 列和索引连接
left.join(right, on=key_or_keys)
result = left.join(right, on=['key1', 'key2'])
pd.merge(left, right, left_on=key_or_keys, right_index=True,
how='left', sort=False)
# 连接方式
result = left.join(right, how='inner')
# 取消索引按列连接
pd.merge(left.reset_index(), right.reset_index(),
on=['key'], how='inner').set_index(['key', 'Y'])
更新时间:2024-08-14 14:44:14 标签:pandas 连接