Pandas多条件生成列逻辑错误:df.count[6]结果不符预期
问题描述
我有一个pandas列df.a,取值为1、0、-1,需要基于它生成新列df.c,需求如下:
df.c的取值必须在-1到1之间;- 若
df.a与前一行df.c的差值为1或-1,则当前df.c沿用前一行值; - 若
df.a为0,当前df.c也沿用前一行值; - 若
df.a为1或-1,则将其与前一行df.c相加后赋值给当前df.c。
我的代码实现如下:
初始化df.c为df['a'][0] == 1。
a=df['a'] + df['count'].shift(1) < -1 b=df['a'] + df['count'].shift(1) > 1 c=df['count'].shift(1) == -1 d=df['count'].shift(1) == 1 e=df['count'].shift(1) == '0' g=df['a']=='-1' h=df['a']=='1' i=df['a']=='0' conditions=[a|b|i&d|i&c,h&e|g&e,e&i|c&h|d&g] choices=[df['count'].shift(1), df['a'], '0'] df['count'] = np.select(conditions, choices, default=df['count'])
问题在于,处理df['a'][4]时,df['count'][6]的预期结果应为0,但实际得到1,请问我哪里出错了?
测试数据
a c expected result 0 1 nan 1 1 1 1.0 1 2 0 1.0 1 3 1 1.0 1 4 -1 0 0 5 0 1.0 0 6 1 1.0 1 7 1 1.0 1 8 -1 0 0 9 -1 0 -1 10 -1 0 -1 11 0 1.0 -1 12 -1 0 -1 13 1 1.0 0 14 0 1.0 0 15 1 1.0 1
问题分析与修复
你的代码存在几个核心问题:
- 数据类型不匹配:把数值型的
df.a和df.count当成字符串比较(比如g=df['a']=='-1'、e=df['count'].shift(1) == '0'),但实际列存储的是数值1、0、-1,这直接导致所有条件判断失效。 - 逻辑条件混乱:
conditions里的逻辑组合完全不符合需求,比如i&d(df.a为0且前一行count为1)的场景,本该直接沿用前一行值,但你的条件覆盖逻辑错误,导致后续计算偏离预期。 - 初始化错误:初始化
df.c为df['a'][0] == 1会得到布尔值True/False,而非数值1,正确初始化应为df['c'] = df['a'].iloc[0]。 - 计算方式错误:
np.select是向量化操作,无法处理逐行依赖前一行结果的递推逻辑,而你的需求本质是按顺序逐行计算,前一行的结果会影响当前行,向量化操作不适用这种场景。
正确实现代码
针对逐行递推的需求,最直观且不易出错的方式是用循环逐行计算:
import pandas as pd # 构造测试数据 data = { 'a': [1,1,0,1,-1,0,1,1,-1,-1,-1,0,-1,1,0,1], 'expected result': [1,1,1,1,0,0,1,1,0,-1,-1,-1,-1,0,0,1] } df = pd.DataFrame(data) # 初始化新列c df['c'] = 0.0 df.loc[0, 'c'] = df.loc[0, 'a'] # 第一行直接取a的数值 # 逐行递推计算 for i in range(1, len(df)): prev_c = df.loc[i-1, 'c'] current_a = df.loc[i, 'a'] if current_a == 0: df.loc[i, 'c'] = prev_c else: # 计算相加后的值,并限制在-1到1的范围内 new_c = prev_c + current_a df.loc[i, 'c'] = max(min(new_c, 1), -1) # 输出验证 print(df[['a', 'c', 'expected result']])
结果说明
运行上述代码后,df.c会完全匹配预期结果:比如索引5的c为0,索引6的c为1(前一行0加1后符合-1到1的范围),完全符合需求逻辑。
内容的提问来源于stack exchange,提问作者YL Leung
相关产品推荐
相关产品推荐

