You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简化DataFrame逐列生成正向连续streak值的重复代码?

简化DataFrame正向连续streak次数计算的代码

需要将DataFrame中的所有数值替换为对应的当前正向连续streak次数,目前已实现该功能,但因逐列手动指定列名编写代码,导致代码冗余杂乱,希望获得简化代码的方法。

原实现代码:

import pandas as pd
import numpy as np

df = pd.DataFrame([[9, 5, 2], [-2, 6, -4], [-5, 1, -1], [9, 6, -5], [7, -1, -3], [6, -4, 1], 
              [2, -9, 3]],
             columns=['A', 'B', 'C'], index=[1, 2, 3, 4, 5, 6, 7])

def streaks(df, col):
    sign = np.sign(df[col])
    s = sign.groupby((sign!=sign.shift()).cumsum()).cumsum()
    return df.assign(A=s.where(s>0, 0.0).abs())
df = streaks(df, 'A')

def streaks(df, col):
    sign = np.sign(df[col])
    s = sign.groupby((sign!=sign.shift()).cumsum()).cumsum()
    return df.assign(B=s.where(s>0, 0.0).abs())
df = streaks(df, 'B')

def streaks(df, col):
    sign = np.sign(df[col])
    s = sign.groupby((sign!=sign.shift()).cumsum()).cumsum()
    return df.assign(C=s.where(s>0, 0.0).abs())
df = streaks(df, 'C')

简化方案

方法一:通用函数+批量遍历

提取通用计算逻辑,遍历所有列批量处理:

import pandas as pd
import numpy as np

df = pd.DataFrame([[9, 5, 2], [-2, 6, -4], [-5, 1, -1], [9, 6, -5], [7, -1, -3], [6, -4, 1], 
              [2, -9, 3]],
             columns=['A', 'B', 'C'], index=[1, 2, 3, 4, 5, 6, 7])

def calculate_positive_streak(series):
    sign = np.sign(series)
    # 标记连续相同符号的分组
    group_id = (sign != sign.shift()).cumsum()
    # 计算分组内连续次数,负向时重置为0
    streak = sign.groupby(group_id).cumsum()
    return streak.where(streak > 0, 0.0).abs()

# 遍历所有列更新数据
for col in df.columns:
    df[col] = calculate_positive_streak(df[col])

方法二:使用apply一次性处理所有列

利用apply方法对整列批量应用计算逻辑:

import pandas as pd
import numpy as np

df = pd.DataFrame([[9, 5, 2], [-2, 6, -4], [-5, 1, -1], [9, 6, -5], [7, -1, -3], [6, -4, 1], 
              [2, -9, 3]],
             columns=['A', 'B', 'C'], index=[1, 2, 3, 4, 5, 6, 7])

def calculate_positive_streak(series):
    sign = np.sign(series)
    group_id = (sign != sign.shift()).cumsum()
    streak = sign.groupby(group_id).cumsum()
    return streak.where(streak > 0, 0.0).abs()

# 对所有列应用函数,直接生成结果
df = df.apply(calculate_positive_streak)

简化说明

  • 把重复的计算逻辑封装成通用函数calculate_positive_streak,接收单列数据(Series)作为输入,输出处理后的连续次数
  • 两种方法都避免了重复定义函数和硬编码列名,新增数值列时无需修改代码,直接自动适配
  • 保留原逻辑的核心:通过符号分组计算连续次数,仅保留正向连续计数,负向时重置为0

内容的提问来源于stack exchange,提问作者Nad545

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 22:01:17