如何根据条件合并两个 Pandas 不同大小的 DataFrame

How to merge two Pandas DataFrames of different size based on condition

我有一个要合并到的主 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']])

尝试将指标列添加到 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