如何在Pandas中使用apply传递两列参数给自定义函数?
Pandas通过apply处理DataFrame列生成新字段的优化实现
需求说明
给DataFrame新增Full Name列,规则如下:
- 若
Name列按:拆分后的前缀为John,返回John - 若前缀不是
John,则根据Id列的值匹配id_reference字典,返回对应全名
原代码存在的问题
- 函数
some_function额外添加了split[0] == 'Jess'的判断,不符合“所有非John前缀都走Id匹配”的需求 - 当
Id不在id_reference字典中时,会直接抛出KeyError,没有边界处理
优化后的实现方案
方案1:修正apply逻辑(保持逐行处理)
先导入依赖并定义数据:
import pandas as pd d = { 'Name': ['John:Smith', 'John:Carter', 'Jess:Wayne'], 'Id': [12, 13, 14] } id_reference = { 14: 'Jessica', 15: 'William' } df = pd.DataFrame.from_dict(d)
编写修正后的自定义函数,增加边界处理:
def get_full_name(name, id_val): prefix = name.split(':')[0] if prefix == 'John': return 'John' # 用get方法避免KeyError,Id不存在时返回原前缀(可根据需求改成其他默认值,比如pd.NA) return id_reference.get(id_val, prefix)
调用apply生成新列:
df['Full Name'] = df.apply(lambda row: get_full_name(row['Name'], row['Id']), axis=1)
执行后得到结果:
Name Id Full Name 0 John:Smith 12 John 1 John:Carter 13 John 2 Jess:Wayne 14 Jessica
方案2:矢量化操作(更高效,适合大数据集)
apply是逐行处理,数据量大时效率较低,推荐用pandas矢量化方法替代:
# 拆分Name列提取前缀 df['Prefix'] = df['Name'].str.split(':').str[0] # 按规则赋值:前缀是John则保留John,否则用Id匹配字典,匹配失败返回原前缀 df['Full Name'] = df['Prefix'].where(df['Prefix'] == 'John', df['Id'].map(id_reference).fillna(df['Prefix'])) # 删除临时的Prefix列 df = df.drop('Prefix', axis=1)
这个方法利用pandas内置的矢量化字符串操作和map方法,运行效率远高于逐行apply。
内容的提问来源于stack exchange,提问作者Novice Python charmer
相关产品推荐
相关产品推荐

