【问题标题】:How to keep Zero counts for pandas groupby count for 2 columns dataframe?如何保持 2 列数据帧的 pandas groupby 计数为零?
【发布时间】:2019-09-16 23:48:19
【问题描述】:

如果数据框有 3 列,我发现这个 StackOverflow 答案给出了零计数: Pandas groupby for zero values

但是,如何对只有两列的数据框执行此操作:

问题
注意:最好在连锁操作中回答

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

为了计算 a 的数量,我这样做:

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

连锁操作的必填答案

        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

我的尝试:

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

这不起作用。

如何解决这个问题?

相关链接:
Pandas groupby for zero values

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    如你所见

    (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
    

    【讨论】:

      【解决方案2】:

      只是让@ALollz 的答案更美观:

      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
      

      【讨论】:

        【解决方案3】:

        在 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
        

        可以点击.rename('a_count').reset_index() 以获得您的准确输出。


        或者,如果用例有点复杂并且不可能,您总是可以在 groupby 之后 reindex + fillna

        (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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-03-16
          • 2019-01-03
          • 2020-01-09
          • 1970-01-01
          • 1970-01-01
          • 2015-10-11
          • 1970-01-01
          • 2018-05-11
          相关资源
          最近更新 更多