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

Pandas自定义函数修改DataFrame指定行多列返回NaN如何解决

问题原因

返回NaN是代码存在4处错误导致:

  1. 关键字拼写错误:lambda 错写为 lamba,缺少字母d
  2. 参数位置错误:axis=1 是apply方法的参数,你错误地将其传入了自定义函数f的参数列表中,导致apply默认按列处理而非按行处理
  3. 索引对齐失败:apply返回的DataFrame没有指定和原表一致的列名,直接赋值给df.loc筛选的列时,pandas的列对齐逻辑找不到匹配项,直接填充为空值
  4. 自定义函数逻辑缺陷:处理target2类型行时,直接对字典对象调用values()会返回dict_values类型对象,无法得到你预期的字符串集合结果。
修正后完整代码
import pandas as pd

# 修正后的处理函数
def f(field, value1, value2):
    if field == 'target':
        v1 = [{item} for item in value1]
        v2 = [{item} for item in value2]
    elif field == 'target2':
        # 遍历字典取实际值,转单元素集合
        v1 = [{val} for d in value1 for val in d.values()]
        v2 = [{val} for d in value2 for val in d.values()]
    else:
        v1, v2 = value1, value2
    # 返回时指定列名,对齐原表字段
    return pd.Series([v1, v2], index=['value1', 'value2'])

# 筛选目标行
mask = df['field'].isin(['target', 'target2'])
# 修正apply语法,赋值时取.values跳过索引对齐校验
df.loc[mask, ['value1', 'value2']] = df[mask].apply(
    lambda row: f(row['field'], row['value1'], row['value2']),
    axis=1
).values
运行结果

执行代码后得到的结果和预期完全一致:

field      value1                 value2   value3
0  target   [{'list'}]  [{'123'}, {'length'}]    'abc'
1  random    [32.67]                [47.00]    'bcd'
2  target   [{'word'}]                [{105}]    'efg'
3  target2  [{'123'}]              [{'333'}]    'xyz'
注意事项

如果你的value1、value2列存储的是字符串格式的列表/字典(比如从csv读取后未做类型转换),需要先用ast.literal_eval将字符串转为原生Python列表/字典对象,否则遍历会按单个字符拆分,得到不符合预期的结果。

内容的提问来源于stack exchange,提问作者Boon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 19:48:29