Подтвердить что ты не робот

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() и какие из них исключить?

4b9b3361

Ответ 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')