DataFrame逐行应用函数报错:如何传入完整DataFrame作为参数?
问题分析与解决方案
代码里的核心问题
- 笔误错误:
load_data函数里的df_gt.apply是笔误,应写成df.apply,否则会报变量未定义错误 - 参数类型误解:使用
df.apply(func, axis=1)时,传入func的是单行的Series对象,不是完整DataFrame。你在name_list里把它当成DataFrame处理(比如df[['item_name']]循环),必然触发错误 - 循环逻辑错误:即便处理单行Series,
for column in df[['item_name']]遍历的是列名,不是item_name的具体值,完全不符合需求 - 变量初始化错误:
names在循环内部初始化,每次循环都会被清空,最终只能得到最后一个添加的值
方案1:仅处理每行item_name(无需完整DataFrame)
如果逻辑只需要当前行的item_name值,修改函数和调用方式即可:
import json import pandas as pd def load_data(data_file): with open(data_file, 'r', encoding='utf8') as d: data = json.load(d) df = pd.DataFrame.from_dict(data) # 逐行应用函数,新增names_list列 df['names_list'] = df.apply(name_list, axis=1) return df def name_list(row): # 直接获取当前行的item_name值 item_name = row['item_name'] names = [] # 这里写入你的逻辑校验与处理代码,示例: if '生鲜' in item_name: names.append('食品类') if '电子' in item_name: names.append('数码类') return names
方案2:需要传入完整DataFrame(处理逻辑依赖全量数据)
如果逻辑必须用到整个DataFrame的其他数据(比如跨行关联校验),无需使用apply(axis=1),直接把完整DataFrame传入函数处理:
import json import pandas as pd def load_data(data_file): with open(data_file, 'r', encoding='utf8') as d: data = json.load(d) df = pd.DataFrame.from_dict(data) # 直接传入完整DataFrame df = name_list(df) return df def name_list(df): names_list = [] # 遍历完整DataFrame的每一行 for idx, row in df.iterrows(): item_name = row['item_name'] names = [] # 你的逻辑校验与处理代码,示例: if len(item_name) > 6: names.append('长命名') else: names.append('短命名') names_list.append(names) # 新增目标列 df['names_list'] = names_list return df
额外提示
- 如果处理逻辑可以向量化(无需逐行循环),优先用pandas的向量化操作,比
apply或iterrows效率高得多。比如用df['item_name'].str.contains()直接生成结果列 - 调试时可以在函数里先打印参数类型(比如
print(type(row))),能快速明确传入的数据结构
内容的提问来源于stack exchange,提问作者Lilly
相关产品推荐
相关产品推荐

