Python 合并具有不同结构的两个数据帧

Python 合并具有不同结构的两个数据帧,python,pandas,data-wrangling,Python,Pandas,Data Wrangling,我正在尝试将两个数据帧相互组合。但我还是停留在逻辑上(也许我对这个问题看得太久了) 问题: 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 然后,我有另一个数

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

问题: 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

我想合并这两列(格式与DF1相同)。 我的假设是,is应该类似于,groupby(Country+ID),然后(Month作为列,求和数字)。-但正如前面所说,我感到困惑

期望输出:

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('Number', fill_value=0)
    
  • 以相同格式合并现在很容易

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

根据@Nk03的回答,步骤1和步骤2可以替换为使用
aggfunc
参数调用
.pivot\u table

你看过这个了吗:aggfunc在理想情况下不应该是
np.sum
(因为每个文档的默认值似乎是
np.mean
)?这也是pivot_表文档中的示例所建议的。我不知道为什么,但它们似乎并不完全相同,例如,请参见
sum(pd.Series([1,np.nan])
vs.
np.sum(pd.Series([1,np.nan])
。@Cimbali,我正在用0填充nan值。所以,我想在这种特殊情况下这并不重要。
df1.merge(df2.add_prefix('df2_').reset_index(), on=['Country', 'ID'])