Pandas сумма по группам, но исключить определенные столбцы
Каков наилучший способ сделать groupby на Pandas фреймворке данных, но исключить некоторые столбцы из этой группы? Например. У меня есть foll. dataframe:
Code Country Item_Code Item Ele_Code Unit Y1961 Y1962 Y1963
2 Afghanistan 15 Wheat 5312 Ha 10 20 30
2 Afghanistan 25 Maize 5312 Ha 10 20 30
4 Angola 15 Wheat 7312 Ha 30 40 50
4 Angola 25 Maize 7312 Ha 30 40 50
Я хочу группировать столбец Страна и Item_Code и вычислять только сумму строк, подпадающих под столбцы Y1961, Y1962 и Y1963. Результирующий файл данных должен выглядеть следующим образом:
Code Country Item_Code Item Ele_Code Unit Y1961 Y1962 Y1963
2 Afghanistan 15 C3 5312 Ha 20 40 60
4 Angola 25 C4 7312 Ha 60 80 100
Сейчас я делаю это:
df.groupby('Country').sum()
Однако это также добавляет значения в столбец Item_Code. Есть ли способ указать, какие столбцы включить в операцию sum() и какие из них исключить?
Ответы
Ответ 1
Вы можете выбрать столбцы группы:
In [11]: df.groupby(['Country', 'Item_Code'])[["Y1961", "Y1962", "Y1963"]].sum()
Out[11]:
Y1961 Y1962 Y1963
Country Item_Code
Afghanistan 15 10 20 30
25 10 20 30
Angola 15 30 40 50
25 30 40 50
Обратите внимание, что пройденный список должен быть подмножеством столбцов, иначе вы увидите KeyError.
Ответ 2
Функция agg
сделает это за вас. Передайте столбцы и выполните функцию dict с столбцом, вывод:
df.groupby(['Country', 'Item_Code']).agg({'Y1961': np.sum, 'Y1962': [np.sum, np.mean]}) # Added example for two output columns from a single input column
Это отобразит только группу по столбцам и указанные столбцы агрегата. В этом примере я включил две функции agg, применяемые к "Y1962".
Чтобы получить то, что вы надеялись увидеть, включили другие столбцы в группу и примените суммы к Y-переменным в кадре:
df.groupby(['Code', 'Country', 'Item_Code', 'Item', 'Ele_Code', 'Unit']).agg({'Y1961': np.sum, 'Y1962': np.sum, 'Y1963': np.sum})
Ответ 3
Если вы ищете более обобщенный способ применения ко многим столбцам, то вы можете создать список имен столбцов и передать его как индекс сгруппированного фрейма. В вашем случае, например:
columns = ['Y'+str(i) for year in range(1967, 2011)]
df.groupby('Country')[columns].agg('sum')