如何合并大熊猫dataframes不重复列

问题描述 投票:3回答:1

我有以下形式的数据:

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),但该数据具有不同的形状。请注意,我有多个供应商,他们有不同的比赛号码,所以我不能假设数据有一个“矩形”形状。提前致谢。

python pandas merge
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.