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

基于列值的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 16:27:09