7
votes

Comptage des valeurs de colonne en fonction des valeurs d'autres colonnes pour les cadres de données Pandas

J'essaie de compter le nombre de chaque catégorie de tempête pour chaque combinaison unique x et y . Par exemple. Mon dataframe ressemble à:

Cat       x           y     
1       3773         3773
2       1230         1230
3       604          604
4       266          266
5       50           50
NA      27620        27620
TS      16884        16884

Je veux créer un dataframe qui ressemble à:

df[['x','y','Category']].groupby(['Category']).count()

J'ai essayé différentes combinaisons de .groupby () et .count () , mais je n'obtiens toujours pas le résultat souhaité. La chose que je pourrais obtenir dans le placard est:

x   y   Category 1   Category 2   Category 3  Category 4
1   1        0           0            1           0
2   1        1           1            0           0
3   2        0           0            0           1

Cependant, le résultat compte pour tous les x et y , pas pour le paires uniques:

x   y  year  Category
1   1  1988     3
2   1  1977     1
2   1  1999     2
3   2  1990     4

Est-ce que quelqu'un sait comment effectuer une opération de comptage sur une colonne basée sur l'unicité de deux autres colonnes dans un dataframe?


0 commentaires

4 Réponses :



0
votes

Ou utilisez groupby deux fois, avec beaucoup d'autres, c'est-à-dire get_dummies avec apply etc ...

Comme: p>

>>> df.join(df.groupby(['x','y'])['Category']
           .apply(lambda x: x.astype(str).str.get_dummies().add_prefix('Category ')))
           .groupby(['x','y']).sum().fillna(0).drop(['year','Category'],1).reset_index()
   x  y  Category 1  Category 2  Category 3  Category 4
0  1  1         0.0         0.0         1.0         0.0
1  2  1         1.0         1.0         0.0         0.0
2  3  2         0.0         0.0         0.0         1.0
>>> 


1 commentaires

@MohitMotwani C'est fait.



1
votes

Vous pouvez utiliser groupby a > d'abord:

df_new = df_new.pivot_table(index=['x', 'y'], columns='Category', values='count', fill_value=0)
df_new
Category    1   2   3   4
x   y               
1   1       0   0   1   0
2   1       1   1   0   0
3   2       0   0   0   1

Puis pivot_table

df_new = df.groupby(['x', 'y', 'Category']).count()
df_new
                  year  count
x   y   Category        
1   1      3       1    1
2   1      1       1    1
           2       1    1
3   2      4       1    1


0 commentaires

1
votes

Vous pouvez utiliser pd.get_dummies après avoir défini l'index à l'aide de set_index , puis utiliser sum avec le paramètre level pour réduire les lignes:

   x  y  Category 1  Category 2  Category 3  Category 4
0  1  1           0           0           1           0
1  2  1           1           1           0           0
2  3  2           0           0           0           1

Résultat:

pd.get_dummies(df.set_index(['x','y'])['Category'].astype(str),
               prefix='Category ', 
               prefix_sep='')\
  .sum(level=[0,1])\
  .reset_index()


0 commentaires