【问题标题】:How to merge two Pandas DataFrames of different size based on condition如何根据条件合并两个不同大小的 Pandas DataFrame
【发布时间】:2021-06-15 23:35:20
【问题描述】:

我有一个要合并的主 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 与之关联。

如何将 o_type_df 合并到所有 TypeID 'O' 行的 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']])

【问题讨论】:

    标签: python pandas dataframe merge


    【解决方案1】:

    尝试向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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-04
      • 2021-10-02
      • 2022-08-19
      • 2015-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多