如何在不复制列的情况下合并熊猫数据框

时间:2019-02-01 22:04:48

标签: 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),但是数据的形状不同。请注意,我有多个供应商,并且它们具有不同数量的匹配项,因此我不能假定数据将具有“矩形”形状。预先感谢。

2 个答案:

答案 0 :(得分:2)

您的问题是您真的不想只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

答案 1 :(得分:0)

=Sumifs(Sheet1!C:C,Sheet1!A:A,Sheet2!A3)

它对我有用,因此想在这里分享