我有以下形式的数据:
frame1 = pd.DataFrame({'supplier1_match0': ['x'], 'id': [1]})
frame2 = pd.DataFrame({'supplier1_match0': ['2x'], 'id': [2]})
并希望将多个框架左连接到这样的框架:
base_frame = pd.DataFrame({'id':[1,2,3]})
我合并了 id 并得到:
merged = base_frame.merge(frame1, how='left', left_on='id', right_on='id')
merged = merged.merge(frame2, how='left', left_on='id', right_on='id')
id supplier1_match0_x supplier1_match0_y
0 1 x NaN
1 2 NaN 2x
2 3 NaN NaN
该列被复制并附加了一个“y”。这是我需要的:
id, supplier1_match0, ...
1, x
2, 2x
3, NaN
有没有简单的方法来实现这一目标?有一个类似的问题( Nested dictionary to multiindex dataframe where dictionary keys are column labels ),但数据具有不同的形状。请注意,我有多个供应商,并且他们有不同数量的匹配项,因此我不能假设数据将具有“矩形”形状。提前致谢。
最佳答案
你的问题是你真的不想只是 merge
一切。您需要对第一组帧进行 concat
,然后合并。
import pandas as pd
import numpy as np
base_frame.merge(pd.concat([frame1, frame2]), how='left')
# id supplier1_match0
#0 1 x
#1 2 2x
#2 3 NaN
或者,您可以定义
base_frame
以便它具有其他帧的所有相关列,并将 id
设置为索引并使用 .update
。这确保 base_frame
保持相同的大小,而上面的则没有。如果给定单元格有多个非空值,则数据将被覆盖。base_frame = pd.DataFrame({'id':[1,2,3]}).assign(supplier1_match0 = np.NaN).set_index('id')
for df in [frame1, frame2]:
base_frame.update(df.set_index('id'))
print(base_frame)
supplier1_match0
id
1 x
2 2x
3 NaN
关于python - 如何在不重复列的情况下合并 Pandas 数据框,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54487745/