合并两个具有不同结构的Dataframes

Merge two Dataframes with different structures

我正在尝试将两个数据帧相互组合。但是我坚持逻辑(也许我对这个问题看得太久了)。

问题: DF1 的格式如下:

Country       ID    March    April  May  June 
Netherlands   A      10       20     15   14 
Netherlands   B      15       18     10    4
Germany       C       9        8      3    1 

然后,我有另一个数据框:

DF2

Country      ID    Month   Number
Netherlands  A     March     8  
Netherlands  A     March     28  
Netherlands  B     April     18  
Germany      C     Jan       9

我想合并这两列(格式与 DF1 相同)。 我的假设是应该类似于按(国家/地区 + ID)分组,然后(月份作为列,然后对数字求和)。 - 但如前所述,我很困惑。

期望的输出:

Country       ID    March    April  May  June   df2_Jan  df2_March   df2_April
Netherlands   A      10       20     15   14       0       36 #8+28     0
Netherlands   B      15       18     10    4       0        0          18
Germany       C       9        8      3    1       9        0           0

希望你能帮助我。非常感谢!

你可以试试:

merged_df = (
    df1.merge(
        df2.pivot_table(
            index=['Country', 'ID'],
            columns='Month',
            values='Number',
            aggfunc=sum,
            fill_value=0)
        .add_prefix('df2_')
        .reset_index(),
        on=['Country', 'ID']
    )
)

输出:

       Country ID  March  April  May  June  df2_April  df2_Jan  df2_March
0  Netherlands  A     10     20   15    14          0        0         36
1  Netherlands  B     15     18   10     4         18        0          0
2      Germany  C      9      8    3     1          0        9          0
  • 在DF2中求和确实是一个简单的groupby().sum()操作

    df2 = df2.groupby(['Country', 'ID', 'Month'])['Number'].sum()
    

    您现在有一个具有 3 级索引的系列。

  • 似乎要使 DF2 的格式与 DF1 相同,您只需要一个 .unstack() 将其中一个索引级别转换为列。

    df2 = df2.unstack('Month', fill_value=0)
    
  • 以相同格式合并现在很容易

    df1.merge(df2.add_prefix('df2_').reset_index(), on=['Country', 'ID'])
    

根据@Nk03 的回答,第 1 步和第 2 步可以替换为使用 aggfunc 参数调用 .pivot_table