Quelle est la meilleure façon de faire un groupby sur un dataframe Pandas, mais d'exclure certaines colonnes de ce groupby? 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 veux regrouper par la colonne Country et Item_Code et calculer uniquement 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 de la colonne Item_Code. Existe-t-il un moyen de spécifier les colonnes à inclure dans l' sum()
opération et celles à exclure?
listColumns = list(df.columns)
puis vous supprimez les colonnes que vous ne voulez pas,listColumns.remove('Y1964')
et enfin faites votre addition:df.groupby(['Country', 'Item_Code'])[listColumns].sum()
cannot reindex from a duplicate axis
La
agg
fonction le fera pour vous. Passez les colonnes et fonctionnent 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 le groupe par colonnes et les colonnes d'agrégation 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 dans le cadre:
df.groupby(['Code', 'Country', 'Item_Code', 'Item', 'Ele_Code', 'Unit']).agg({'Y1961': np.sum, 'Y1962': np.sum, 'Y1963': np.sum})
la source
Si vous recherchez une manière plus générale d'appliquer à de nombreuses colonnes, vous pouvez créer une liste de noms de colonnes et la transmettre en tant qu'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')
la source