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 indexing
或query
过滤:
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
最后将NaN
s 替换为ffill
(fillna
with method='ffill')。但是获取第一个值仍然是NaN
s,将其替换为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函数和cumsum函数计算每个分组内的数值累加值并生成新的dataframe数据列( cumulative sum of each group in dataframe