Python:如何根据其他列的值对指定列应用函数
问题修正与解决方案
你的代码存在几个明显错误,我会逐一指出并给出正确实现:
原代码的问题点
- 自定义函数
add_string里误用了函数名作为变量,应该用传入的add_str参数,而且这里不需要递归,直接拼接即可 apply的lambda中,判断条件应该针对当前行的Job值(x['Job'] == 1),而非整个列的布尔结果- else分支引用了不存在的
SubjID列,应该保留原行的ID值 - 调用自定义函数时没有传入正确的当前行
ID值,而是用了未定义的string变量
正确实现方式
方式1:修正自定义函数+apply
def add_underscore(string): # 截取第一个字符,拼接下划线,再拼接剩余部分 return string[0] + '_' + string[1:] # 逐行处理:Job为1时调用函数,否则保留原ID df['ID'] = df.apply(lambda x: add_underscore(x['ID']) if x['Job'] == 1 else x['ID'], axis=1)
方式2:更高效的向量化操作(推荐)
apply逐行处理效率较低,大数据量下建议用Pandas的字符串方法结合布尔索引:
# 先筛选Job=1的行,直接修改ID列 mask = df['Job'] == 1 df.loc[mask, 'ID'] = df.loc[mask, 'ID'].str[0] + '_' + df.loc[mask, 'ID'].str[1:]
或者用np.where一行搞定:
import numpy as np df['ID'] = np.where(df['Job'] == 1, df['ID'].str[0] + '_' + df['ID'].str[1:], df['ID'])
运行后你的DataFrame会变成:
| ID | Job |
|---|---|
| 1_xyz | 1 |
| 2_xyz | 1 |
| 3xyz | 0 |
内容的提问来源于stack exchange,提问作者sprc
相关产品推荐
相关产品推荐

