Pandas 依据col2列条件创建带重置规则的indexed新列
原有代码的核心问题
- 循环逻辑错位:遍历单行做条件判断时,直接对整个
df['indexed']列做全列重赋值,没有逐行更新对应位置的计算值,会直接覆盖之前已完成的计算结果 - 计算逻辑错位:在循环内部反复对整列执行
col1 * indexed.shift(1),和需要逐行递推的滚动计算需求完全不匹配,无法实现"当前x行值=当前col1×上一行indexed值"的逻辑
正确实现方案
方案1:逐行遍历(逻辑直白,适合小数据量场景)
在已经完成col1加1、首行indexed初始化的基础上,从第二行开始逐行按规则计算,修正原来循环的全列赋值问题:
# 从第二行开始逐行计算,跳过已初始化的首行 for i in range(1, len(df)): # 遇到非x值,当前行固定设为100,作为新分段的起点 if df.loc[i, 'col2'] != 'x': df.loc[i, 'indexed'] = 100 # x值行取当前col1乘以上一行的indexed值 else: df.loc[i, 'indexed'] = df.loc[i, 'col1'] * df.loc[i-1, 'indexed']
方案2:向量化分组计算(大表下效率远高于循环)
利用分段累积的特性,先按"非x值"的位置切分计算段,再在每个段内做累积乘积,避免逐行循环的性能损耗:
# 1. 按非x位置切分计算段,连续x的行会被归为同一个分段 df['seg_id'] = (df['col2'] != 'x').cumsum() # 2. 定位每个分段的第一行(也就是需要重置为100的位置) group_first_rows = df.groupby('seg_id').head(1).index # 3. 构造累积计算的因子列:分段首行因子设为1,其余x行因子取col1值 factor = df['col1'].copy() factor.loc[group_first_rows] = 1 # 4. 每个分段内按因子做累积乘积,乘以起点值100得到最终结果 df['indexed'] = factor.groupby(df['seg_id']).cumprod() * 100 # 可删除中间生成的辅助列 df = df.drop(columns=['seg_id'])
计算结果核对
按照示例数据,两种方案得到的indexed列结果完全一致,值依次为:[100.0, 112.0, 100.8, 100.0, 101.0, 103.02, 115.3824, 103.84416, 96.5750688, 97.540819488]
完全符合"遇到非x值就从100重启分段累积"的规则。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

