基于列值的Pandas条件数学运算:生成end_value列求助
Pandas条件生成数值新列的正确实现
原始数据
初始DataFrame定义:
import pandas as pd data= {'start_value':[10,20,30,40,50,60,70], 'identifier':['+','+','-','-','+','-','-']} df = pd.DataFrame(data)
数据内容:
start_value identifier 0 10 + 1 20 + 2 30 - 3 40 - 4 50 + 5 60 - 6 70 -
需求
新增end_value列:
- 当
identifier为+时,end_value = start_value + 5 - 当
identifier为-时,end_value = start_value - 5
预期结果(end_value为float类型):
start_value identifier end_value 0 10 + 15.0 1 20 + 25.0 2 30 - 25.0 3 40 - 35.0 4 50 + 55.0 5 60 - 55.0 6 70 - 65.0
错误原因分析
你之前的代码问题在于第二次赋值完全覆盖了第一次的结果:
df['end_value'] = 5 + df.loc[df['identifier']=="+"]['start_value'] df['end_value'] = -5 + df.loc[df['identifier']=="-"]['start_value']
第一行仅给identifier=+的行赋值,其余行是NaN;第二行仅给identifier=-的行赋值,覆盖后原来的+行就全部变成NaN了。
正确实现方法
方法1:使用numpy.where(最简洁)
通过条件判断直接生成整列,自动转为float类型:
import numpy as np df['end_value'] = np.where(df['identifier'] == '+', df['start_value'] + 5, df['start_value'] - 5)
方法2:使用df.loc分条件赋值
先初始化列,再分别对不同条件的行赋值,避免覆盖:
# 先初始化end_value列为float类型 df['end_value'] = df['start_value'].astype(float) # 对+的行赋值 df.loc[df['identifier'] == '+', 'end_value'] = df['start_value'] + 5 # 对-的行赋值 df.loc[df['identifier'] == '-', 'end_value'] = df['start_value'] - 5
方法3:映射系数后计算
把identifier映射为对应的加减系数,再进行运算:
coef = df['identifier'].map({'+' : 5, '-' : -5}) df['end_value'] = df['start_value'] + coef
以上三种方法都能生成符合要求的end_value列,且数据类型为float。
内容的提问来源于stack exchange,提问作者user8421
相关产品推荐
相关产品推荐

