首页 > 解决方案 > 如何根据条件合并两个不同大小的 Pandas DataFrame

问题描述

我有一个要合并的主 df。我们称它为“primary_df”。

RCID    TypeID    Data
 777         D    Hello
 777         O    Hey
 778         O    Hey
 779         D    Hello

primary_df 包含一个“RCID”列,该列与另一个数据帧中的“O_ID”匹配,该数据帧只有 TypeID 为“O”的数据。我们称它为 df 'o_type_df'

O_ID   O_Data
 777   Foo
 778   Bar

o_type_df 的条目少于 primary_df。在 primary_df 中有重复的 'RCID' 值,因为同一个 RCID 可以有不同的 TypeID 与之关联。

对于 TypeID 'O' 的所有行,如何将 o_type_df 合并到 primary_df 中?

最终结果应该是:

RCID    TypeID    Data     O_ID   O_Data
 777         D    Hello    
 777         O    Hey      777    Foo
 778         O    Hey      778    Bar
 779         D    Hello

代码:

primary_df = pd.DataFrame(columns=['RCID', 'TypeID', 'Data'], data=[[777, 'D', 'Hello'], [777, 'O', 'Hey'], [778, 'O', 'Hey'], [779, 'D', 'Hello']])
o_type_df = pd.DataFrame(columns=['O_ID', 'O_Data'], data=[[777, 'Foo'], [778, 'Bar']])

标签: pythonpandasdataframemerge

解决方案


尝试将指示符列添加到o_type_df

o_type_df['TypeID'] = 'O'

然后merge留在那些列上:

merged = (
    primary_df.merge(o_type_df,
                     left_on=['RCID', 'TypeID'],
                     right_on=['O_ID', 'TypeID'],
                     how='left')
)

merged

   RCID TypeID   Data   O_ID O_Data
0   777      D  Hello    NaN    NaN
1   777      O    Hey  777.0    Foo
2   778      O    Hey  778.0    Bar
3   779      D  Hello    NaN    NaN

或与assign

merged = (
    primary_df.merge(o_type_df.assign(TypeID='O'),
                     left_on=['RCID', 'TypeID'],
                     right_on=['O_ID', 'TypeID'],
                     how='left')
)

merged

   RCID TypeID   Data   O_ID O_Data
0   777      D  Hello    NaN    NaN
1   777      O    Hey  777.0    Foo
2   778      O    Hey  778.0    Bar
3   779      D  Hello    NaN    NaN

推荐阅读