【问题标题】:Count consecutive row values but reset count with every 0 in row计算连续的行值,但用行中的每个 0 重置计数
【发布时间】:2022-12-15 00:37:02
【问题描述】:
在数据框中,我需要计算 column A 中的连续行值并将其求和到一个新列 column B 中。
从 column A 开始,脚本将计算 1s 中的连续运行,但是当出现 0 时,它会在 column B 中打印总计数,然后重置计数并继续处理剩余数据。
期望的结果:
A | B
0 0
1 0
1 0
1 0
1 0
0 4
0 0
1 0
1 0
0 2
我试过使用 .shift() 和各种 if-statements 但没有成功。
【问题讨论】:
标签:
python
finance
counting
cumulative-sum
quantitative-finance
【解决方案1】:
这可能是一种方法。可能存在更优雅的解决方案。
df['B'] = df['A'].groupby(df['A'].ne(df['A'].shift()).cumsum()).cumsum().shift(fill_value=0) * (df['A'].diff() == -1)
这部分 df['A'].groupby(df['A'].ne(df['A'].shift()) 按连续出现的值对数据进行分组。
然后我们采用 cumsum 来计算每个组的累计和。然后我们将结果移动 1 行,因为您希望在组之后进行计数。然后我们屏蔽掉所有不是组 + 1 的最后一行的行。
【解决方案2】:
这是一种方法。但是,我觉得可能有更好的方法......但你现在可以试试这个:
- 例程函数用于递增计数器变量,直到它在
A 列中遇到值 0。此时它获取总计数,然后重置计数器变量。
- 我使用
for-loop 遍历 A 列,并将返回的 B 值附加到列表
- 然后将此列表插入到数据框中。
df = pd.DataFrame({"A":[0,1,1,1,1,0,0,1,1,0]})
def routine(row, c):
val = 0
if row:
c += 1
else:
val = c
c = 0
return(val, c)
B_vals = []
counter = 0
for item in df['A'].values:
b, counter = routine(item, counter)
B_vals.append(b)
df['B'] = B_vals
print(df)
输出:
A B
0 0 0
1 1 0
2 1 0
3 1 0
4 1 0
5 0 4
6 0 0
7 1 0
8 1 0
9 0 2