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?
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.
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})
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')