Pandas自定义函数修改DataFrame指定行多列返回NaN如何解决
问题原因
返回NaN是代码存在4处错误导致:
- 关键字拼写错误:
lambda错写为lamba,缺少字母d - 参数位置错误:
axis=1是apply方法的参数,你错误地将其传入了自定义函数f的参数列表中,导致apply默认按列处理而非按行处理 - 索引对齐失败:
apply返回的DataFrame没有指定和原表一致的列名,直接赋值给df.loc筛选的列时,pandas的列对齐逻辑找不到匹配项,直接填充为空值 - 自定义函数逻辑缺陷:处理
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
相关产品推荐
相关产品推荐

