本文将介绍以下主题:
如何正确地推广到多个DataFrame(以及为什么合并有缺点)在唯一密钥上合并在非唯一密钥上合并
回到顶部
推广到多个数据帧
通常,当多个数据帧要合并在一起时,就会出现这种情况。实际上,这可以通过链接合并调用来实现:
df1.merge(df2, ...).merge(df3, ...)
然而,对于许多DataFrame来说,这很快就失控了。此外,可能需要对未知数量的数据帧进行概括。
在这里,我介绍了pd.concat用于在唯一键上的多路连接,以及DataFrame.join用于在非唯一键上进行多路连接。首先,设置。
# Setup.
np.random.seed(0)
A = pd.DataFrame({'key': ['A', 'B', 'C', 'D'], 'valueA': np.random.randn(4)})
B = pd.DataFrame({'key': ['B', 'D', 'E', 'F'], 'valueB': np.random.randn(4)})
C = pd.DataFrame({'key': ['D', 'E', 'J', 'C'], 'valueC': np.ones(4)})
dfs = [A, B, C]
# Note: the "key" column values are unique, so the index is unique.
A2 = A.set_index('key')
B2 = B.set_index('key')
C2 = C.set_index('key')
dfs2 = [A2, B2, C2]
对唯一键进行多路合并
如果您的键(这里,键可以是列或索引)是唯一的,那么您可以使用pd.concat。请注意,pd.conct在索引上加入DataFrames。
# Merge on `key` column. You'll need to set the index before concatenating
pd.concat(
[df.set_index('key') for df in dfs], axis=1, join='inner'
).reset_index()
key valueA valueB valueC
0 D 2.240893 -0.977278 1.0
# Merge on `key` index.
pd.concat(dfs2, axis=1, sort=False, join='inner')
valueA valueB valueC
key
D 2.240893 -0.977278 1.0
对于完全外部联接,省略join='inner'。请注意,不能指定LEFT或RIGHT OUTER联接(如果需要,请使用下面描述的联接)。
对具有重复项的关键点进行多路合并
concat速度快,但也有缺点。它无法处理重复项。
A3 = pd.DataFrame({'key': ['A', 'B', 'C', 'D', 'D'], 'valueA': np.random.randn(5)})
pd.concat([df.set_index('key') for df in [A3, B, C]], axis=1, join='inner')
ValueError: Shape of passed values is (3, 4), indices imply (3, 2)
在这种情况下,我们可以使用join,因为它可以处理非唯一键(请注意,join在数据帧的索引上连接数据帧;除非另有规定,否则它在后台调用merge并执行LEFT OUTER join)。
# Join on `key` column. Set as the index first.
# For inner join. For left join, omit the "how" argument.
A.set_index('key').join([B2, C2], how='inner').reset_index()
key valueA valueB valueC
0 D 2.240893 -0.977278 1.0
# Join on `key` index.
A3.set_index('key').join([B2, C2], how='inner')
valueA valueB valueC
key
D 1.454274 -0.977278 1.0
D 0.761038 -0.977278 1.0
继续阅读
跳转到Pandas Merging 101中的其他主题继续学习:
合并基础知识-连接的基本类型基于索引的联接推广到多个数据帧*交叉联接
*你在这里