web-dev-qa-db-fra.com

Pandas somme par groupe, mais exclut certaines colonnes

Quel est le meilleur moyen de créer un groupe sur un Pandas dataframe, tout en excluant certaines colonnes de ce groupe? par exemple. J'ai le dataframe suivant:

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 souhaite grouper les colonnes Country et Item_Code et ne calculer que la somme des lignes situées 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()

Toutefois, cela ajoute également les valeurs de la colonne Item_Code. Puis-je spécifier les colonnes à inclure dans l'opération sum() et celles à exclure?

71
user308827

Vous pouvez sélectionner les colonnes d'un groupe par:

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 transmise doit être un sous-ensemble des colonnes sinon vous verrez une erreur KeyError.

97
Andy Hayden

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 n'affichera que le groupe par colonnes et les colonnes d'agrégat 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 du groupe par et appliquez des sommes aux variables Y du cadre:

df.groupby(['Code', 'Country', 'Item_Code', 'Item', 'Ele_Code', 'Unit']).agg({'Y1961': np.sum, 'Y1962': np.sum, 'Y1963': np.sum})
32
leroyJr

Si vous recherchez un moyen plus généralisé d'appliquer à de nombreuses colonnes, vous pouvez créer une liste de noms de colonnes et la transmettre en tant qu'index de la trame de données groupée. Dans votre cas, par exemple:

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

df.groupby('Country')[columns].agg('sum')
11
Superstar