Groupby .cumsum() 如果总和列为零,则为空白?

Posted

技术标签:

【中文标题】Groupby .cumsum() 如果总和列为零,则为空白?【英文标题】:Groupby .cumsum() blank if the summed column is equal to zero? 【发布时间】:2017-11-11 14:21:16 【问题描述】:

我有一个DataFrame .groupby() .cumsum(),一个DataFrame如下:

   Col_A Col_B Col_C
 1   A    0            
 2   A    1     1      
 3   A    1     2      
 4   A    1     3      
 5   B    0     0      
 6   B    1     1      
 7   B    0            
 8   B    1     2      
 9   C    1     1      
10   C    1     2      
11   C    1     3      
12   C    0           

Col_B 的总和是df.groupby(['Col_A'])['Col_B'].cumsum()。但是,当 Col_B == 0 时,.cumsum() 为空白。即使 Col_B 为空,如何记录.cumsum()

生成的 DataFrame 应类似于:

      Col_A Col_B Col_C
     1   A    0     0       
     2   A    1     1      
     3   A    1     2      
     4   A    1     3      
     5   B    0     0      
     6   B    1     1      
     7   B    0     1       
     8   B    1     2      
     9   C    1     1      
    10   C    1     2      
    11   C    1     3      
    12   C    0     3    

【问题讨论】:

【参考方案1】:

我认为您需要先按boolean indexingquery 过滤:

df['Col_C'] = df[df['Col_B'] != 0].groupby(['Col_A'])['Col_B'].cumsum()
print (df)
   Col_A  Col_B  Col_C
1      A      0    NaN
2      A      1    1.0
3      A      1    2.0
4      A      1    3.0
5      B      0    NaN
6      B      1    1.0
7      B      0    NaN
8      B      1    2.0
9      C      1    1.0
10     C      1    2.0
11     C      1    3.0
12     C      0    NaN

或者:

df['Col_C'] = df.query('Col_B != 0').groupby(['Col_A'])['Col_B'].cumsum()
print (df)
   Col_A  Col_B  Col_C
1      A      0    NaN
2      A      1    1.0
3      A      1    2.0
4      A      1    3.0
5      B      0    NaN
6      B      1    1.0
7      B      0    NaN
8      B      1    2.0
9      C      1    1.0
10     C      1    2.0
11     C      1    3.0
12     C      0    NaN

最后将NaNs 替换为ffillfillna with method='ffill')。但是获取第一个值仍然是NaNs,将其替换为fillna,最后将列转换为int

df['Col_C']  = df['Col_C'].ffill().fillna(0).astype(int)
print (df)
   Col_A  Col_B  Col_C
1      A      0      0
2      A      1      1
3      A      1      2
4      A      1      3
5      B      0      3
6      B      1      1
7      B      0      1
8      B      1      2
9      C      1      1
10     C      1      2
11     C      1      3
12     C      0      3

【讨论】:

此解决方案在实施时是正确的。我有一个想法, .groupby() 之后的 .ffill() 可能是正确的,而且确实如此。谢谢! 很高兴能帮上忙,周末愉快!【参考方案2】:

拥有一列 0 与拥有一个完全空白的列不同。 如果您在一列中有 NA,则该列的 .cumsum() 实际上应该是 NA(或您所说的“空白”)。 您可以检查整个列是否为 NA 并相应地设置值。

Documentation:

DataFrame.cumsum(axis=None, skipna=True, *args, **kwargs)
Return cumulative sum over requested axis.

skipna : boolean, default True
Exclude NA/null values. If an entire row/column is NA, the result will be NA

【讨论】:

以上是关于Groupby .cumsum() 如果总和列为零,则为空白?的主要内容,如果未能解决你的问题,请参考以下文章

具有标量结果的 Pandas 总和列为零

GroupBy 和 Sum,如果大于零标记行 True

numpy cumsum()不工作?

pandas使用groupby函数和cumsum函数计算每个分组内的数值累加值并生成新的dataframe数据列( cumulative sum of each group in dataframe

如何在python中的字典列表中查找项目的累积总和

groupby col1 的总和除以 col2 的总和