python - 如何在不复制列的情况下合并 Pandas 数据框

标签 python pandas merge

我有以下形式的数据:

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/

相关文章:

python - 将计算应用于 Pandas DataFrame 中的过滤值

git - 如何维护 TFS 中可用的 git 物理分支文件夹?

git - 将远程 github 存储库中的更改 merge 到本地存储库

python - Reportlab 在表格中插入水平线

python - 从多个位置读取相同的文件名

python - uint8 与 int64 的链接操作

python - 如何在 pandas 中将值从一个数据帧移动到另一个数据帧?

python - 根据回合时间选择 Pandas 数据框行

python - 为什么chrome webdriver配置无效?

c++ - 如何连接几张 map ?