Les Pandas additionnent par groupby, mais excluent certaines colonnes

Quelle est la meilleure façon de faire un groupby sur un dataframe Pandas, mais d'exclure certaines colonnes de ce groupby? E. g. J'ai le 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

Je veux groupby la colonne Country et Item_Code et ne calculer que la somme des lignes tombant sous les colonnes Y1961, Y1962 et Y1963. Le dataframe résultant devrait ressembler à ceci:

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

En ce moment, je fais ceci:

df.groupby('Country').sum()

Cependant, cela ajoute également les valeurs dans la colonne Item_Code. Est - il possible que je peut spécifier les colonnes à inclure dans l'opération sum() et celles à exclure?

48
demandé sur smci 2015-09-24 02:45:53

3 réponses

, Vous pouvez sélectionner les colonnes d'un groupby:

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

notez que la liste passée doit être un sous-ensemble des colonnes sinon vous verrez une KeyError.

69
répondu Andy Hayden 2015-09-24 00:12:27

La fonction agg le fera pour vous. Passer les colonnes et fonctionner comme un dict avec colonne, sortie:

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

Cela affichera uniquement les colonnes group by et les colonnes agrégées spécifiées. Dans cet exemple, j'ai inclus deux fonctions agg appliquées à 'Y1962'.

Pour obtenir exactement ce que vous espériez voir, incluez les autres colonnes dans le group by, et appliquez des sommes aux variables Y dans le cadre:

df.groupby(['Code', 'Country', 'Item_Code', 'Item', 'Ele_Code', 'Unit']).agg({'Y1961': np.sum, 'Y1962': np.sum, 'Y1963': np.sum})
24
répondu leroyJr 2015-09-24 00:11:46

Si vous cherchez une manière plus généralisée d'appliquer à de nombreuses colonnes, ce que vous pouvez faire est de construire une liste de noms de colonnes et de la passer comme index du dataframe groupé. Dans votre cas, par exemple:

columns = ['Y'+str(i) for year in range(1967, 2011)]

df.groupby('Country')[columns].agg('sum')
8
répondu Superstar 2017-09-16 00:35:13