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?
4 Réponses :
Cette colonne de comptage et aggfunc sont assez intelligents.
Merci, j'espérais un peu que quelqu'un indiquerait une façon plus propre de le faire!
C'est propre. Mais expliquez simplement pourquoi vous avez utilisé count = 1. Parce que les autres lecteurs pourraient être confus.
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
>>>
@MohitMotwani C'est fait.
Vous pouvez utiliser groupby a > d'abord: Puis pivot_table 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
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
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()