web-dev-qa-db-fra.com

Comment faire une opération de groupe pandas groupby sur une colonne mais garder l'autre dans la trame de données résultante

Ma question concerne les opérations en groupe avec des pandas. J'ai le DataFrame suivant:

In [4]: df = pd.DataFrame({"A": range(4), "B": ["PO", "PO", "PA", "PA"], "C": ["Est", "Est", "West", "West"]})

In [5]: df
Out[5]: 
   A   B     C
0  0  PO   Est
1  1  PO   Est
2  2  PA  West
3  3  PA  West

Voici ce que je voudrais faire: je veux regrouper par colonne B et faire une somme sur la colonne A. Mais à la fin, je voudrais que la colonne C soit toujours dans le DataFrame. Si je fais :

In [8]: df.groupby(by="B").aggregate(pd.np.sum)
Out[8]: 
    A
B    
PA  5
PO  1

Il fait le travail mais la colonne C est manquante. Je peux aussi faire ça:

In [9]: df.groupby(by=["B", "C"]).aggregate(pd.np.sum)
Out[9]: 
         A
B  C      
PA West  5
PO Est   1

ou

In [11]: df.groupby(by=["B", "C"], as_index=False).aggregate(pd.np.sum)
Out[11]: 
    B     C  A
0  PA  West  5
1  PO   Est  1

Mais dans les deux cas, il regroupe par B ET C et pas seulement B et conserve la valeur C. Ce que je veux faire n'est-il pas pertinent ou existe-t-il un moyen de le faire?

16
Ger

essayez d'utiliser DataFrameGroupBy.agg () méthode avec dict of {column -> function}:

In [6]: df.groupby('B').agg({'A':'sum', 'C':'first'})
Out[6]:
       C  A
B
PA  West  5
PO   Est  1

Depuis les documents:

Fonction à utiliser pour agréger des groupes. S'il s'agit d'une fonction, elle doit fonctionner lorsqu'elle est passée à un DataFrame ou lorsqu'elle est passée à DataFrame.apply. Si un dict est passé, les clés doivent être des noms de colonne DataFrame.

ou quelque chose comme ça en fonction de vos objectifs:

In [8]: df = pd.DataFrame({"A": range(4), "B": ["PO", "PO", "PA", "PA"], "C": ["Est1", "Est2", "West1", "West2"]})

In [9]: df.groupby('B').agg({'A':'sum', 'C':'first'})
Out[9]:
        C  A
B
PA  West1  5
PO   Est1  1

In [10]: df['sum_A'] = df.groupby('B')['A'].transform('sum')

In [11]: df
Out[11]:
   A   B      C  sum_A
0  0  PO   Est1      1
1  1  PO   Est2      1
2  2  PA  West1      5
3  3  PA  West2      5
25
MaxU