Слияние двух фреймов данных с разными структурами

Я пытаюсь объединить два фрейма данных друг с другом. Но я придерживаюсь логики (возможно, я слишком долго смотрел на проблему).

Проблема: 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

Надеюсь, ты сможешь мне помочь. Заранее большое спасибо!


person R overflow    schedule 04.06.2021    source источник
comment
Вы смотрели на это: geeksforgeeks.org/   -  person Shahriar Kabir Khan    schedule 04.06.2021


Ответы (2)


Ты можешь попробовать:

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
person Nk03    schedule 04.06.2021
comment
Разве в идеале agfunc не должно быть np.sum (поскольку в документации по умолчанию используется np.mean)? Это также предлагают примеры из документации pivot_table. Я не уверен, почему, но они не кажутся точно эквивалентными, например, см. sum(pd.Series([1, np.nan])) vs. np.sum(pd.Series([1, np.nan])). - person Cimbali; 04.06.2021
comment
@Cimbali, я заполняю значения NaN нулем. Так что, думаю, в данном конкретном случае это не имеет значения. - person Nk03; 04.06.2021

  • Суммирование в DF2 действительно простая groupby().sum() операция

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

    Теперь у вас есть серия с трехуровневым индексом.

  • Кажется, что для преобразования DF2 в тот же формат, что и для DF1, вам нужен только один .unstack(), который переводит один из уровней индекса в столбцы.

    df2 = df2.unstack('Number', fill_value=0)
    
  • Объединить в один формат теперь просто

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

Шаги 1 и 2 можно заменить одним вызовом .pivot_table с параметром aggfunc в соответствии с ответом @Nk03.

person Cimbali    schedule 04.06.2021