【问题标题】: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
    

    【讨论】:

      猜你喜欢
      • 2021-11-06
      • 1970-01-01
      • 2018-11-17
      • 2021-01-28
      • 1970-01-01
      • 2019-10-24
      • 1970-01-01
      • 2021-05-08
      • 1970-01-01
      相关资源
      最近更新 更多