4 votes

Comment conserver des comptes nuls pour pandas groupby count pour un dataframe à 2 colonnes ?

Si le cadre de données a 3 colonnes, j'ai trouvé cette réponse de StackOverflow qui donne des comptes nuls : Pandas groupby pour les valeurs nulles

Mais, comment faire pour le cadre de données ayant seulement deux colonnes :

Question
NOTE : Réponse préférable dans les opérations de la chaîne :

import numpy as np
import pandas as pd

df = pd.DataFrame({'date': pd.date_range('2018-01-01', periods=6),
                   'a': range(6),
                   })

df.iloc[2,0] = df.iloc[1,0]
print(df)
        date  a
0 2018-01-01  0
1 2018-01-02  1
2 2018-01-02  2
3 2018-01-04  3
4 2018-01-05  4
5 2018-01-06  5

Pour obtenir les comptes d'un je fais ceci :

df1 = (df.query("a > 0")
    .groupby(['date'])[['a']]
    .count()
    .add_suffix('_count')
    .reset_index() 
     )

print(df1)
        date  a_count
0 2018-01-02        2
1 2018-01-04        1
2 2018-01-05        1
3 2018-01-06        1

Réponse requise de l'opération en chaîne

        date  a_count
0 2018-01-01        0  # also include this row
0 2018-01-02        2
1 2018-01-04        1
2 2018-01-05        1
3 2018-01-06        1

Ma tentative :

df1 = (df.query("a > 0")
    .groupby(['date'])[['a']]
    .count()
    .add_suffix('_count')
    .unstack(fill_value=0)
    .to_frame()
    .stack()
    .reset_index() 
     )

print(df1)
   level_0       date  level_2  0
0  a_count 2018-01-02        0  2
1  a_count 2018-01-04        0  1
2  a_count 2018-01-05        0  1
3  a_count 2018-01-06        0  1

Cela ne fonctionne pas.

Comment résoudre ce problème ?

Liens connexes :
Pandas groupby pour les valeurs nulles

2voto

ALollz Points 23271

Attribuez une colonne de la chose que vous voulez compter avant le groupby :

df.assign(to_sum = df.a.gt(0).astype(int)).groupby('date').to_sum.sum()
#date
#2018-01-01    0
#2018-01-02    2
#2018-01-04    1
#2018-01-05    1
#2018-01-06    1
#Name: to_sum, dtype: int32

Peut tac sur .rename('a_count').reset_index() pour obtenir votre résultat exact.


Sinon, si le cas d'utilisation est un peu plus compliqué et que cela n'est pas possible, vous pouvez toujours reindex + fillna après le groupby

(df[df.a > 0].groupby('date').a.count()
     .reindex(df.date.unique()).fillna(0).astype(int)
     .rename('a_count').reset_index())

#        date  a_count
#0 2018-01-01        0
#1 2018-01-02        2
#2 2018-01-04        1
#3 2018-01-05        1
#4 2018-01-06        1

2voto

W-B Points 94428

Aussi simple que vous le voyez

(df['a'].gt(0)).groupby(df['date']).sum().to_frame('count_a').reset_index()
        date  count_a
0 2018-01-01      0.0
1 2018-01-02      2.0
2 2018-01-04      1.0
3 2018-01-05      1.0
4 2018-01-06      1.0

-1voto

Bhishan Poudel Points 339

Je rends juste la réponse de @ALollz plus belle pour l'esthétique :

df1 = (df.assign(
           to_sum = lambda x: (x['a']> 0).astype(int)
                 )
 .groupby('date')['to_sum']
 .sum()
 .rename('a_count')
 .to_frame()
 .reset_index() 

)

print(df1)
print(df1)
        date  a_count
0 2018-01-01        0
1 2018-01-02        2
2 2018-01-04        1
3 2018-01-05        1
4 2018-01-06        1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X