Каков наилучший способ сделать groupby в кадре данных Pandas, но исключить некоторые столбцы из этой groupby? например, у меня есть следующий фрейм данных:
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
Я хочу сгруппировать по столбцам Country и 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()
операцию, а какие исключить?
listColumns = list(df.columns)
затем вы удаляете столбцы, которые вам не нужны,listColumns.remove('Y1964')
и, наконец, проводите суммирование:df.groupby(['Country', 'Item_Code'])[listColumns].sum()
cannot reindex from a duplicate axis
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
Это отобразит только группу по столбцам и указанные столбцы агрегирования. В этом примере я включил две функции аггирования, примененные к «Y1962».
Чтобы получить именно то, что вы надеялись увидеть, включите другие столбцы в группу по и примените суммы к переменным Y в кадре:
df.groupby(['Code', 'Country', 'Item_Code', 'Item', 'Ele_Code', 'Unit']).agg({'Y1961': np.sum, 'Y1962': np.sum, 'Y1963': np.sum})
источник
Если вы ищете более обобщенный способ применения ко многим столбцам, вы можете создать список имен столбцов и передать его в качестве индекса сгруппированного фрейма данных. В вашем случае, например:
columns = ['Y'+str(i) for year in range(1967, 2011)] df.groupby('Country')[columns].agg('sum')
источник