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