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

如何在Pandas中使用apply传递两列参数给自定义函数?

Pandas通过apply处理DataFrame列生成新字段的优化实现

需求说明

给DataFrame新增Full Name列,规则如下:

  • 若Name列按:拆分后的前缀为John,返回John
  • 若前缀不是John,则根据Id列的值匹配id_reference字典,返回对应全名

原代码存在的问题

  1. 函数some_function额外添加了split[0] == 'Jess'的判断,不符合“所有非John前缀都走Id匹配”的需求
  2. 当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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 09:14:58