如何使用pandas apply方法将DataFrame转为合并二维元组列表及解决报错
报错根因
按行执行apply(axis=1)时,自定义函数接收到的单行数据中,row['Score']是单个浮点数标量,并非数组或Series结构,原代码强行调用.tolist()方法就会触发'float' object has no attribute 'tolist'报错。
原自定义函数存在大量冗余设计:没必要额外构造临时列表、没必要借助itertools.cycle循环生成重复值——每行的Score是固定值,拆分关键词后直接和该固定值配对生成元组即可。
可落地方案
1. 精简自定义函数逻辑
去掉所有会触发报错的冗余代码,保留核心处理逻辑:
def func2(row): # 按竖线拆分关键词字符串 words = row['Keywords'].strip('|').split('|') # 逐关键词与当前行固定评分配对,生成二维元组列表 return [(word, row['Score']) for word in words]
修正后的函数单行调用输出和原有预期完全一致,没有多余依赖。
2. 全量apply处理并展平结果
对DataFrame按行应用函数后,返回值是嵌套结构的列表(每一行对应一个独立的元组列表),通过列表推导式展平就能得到目标长元组列表:
# 逐行应用自定义函数 nested_result = dataframe.apply(func2, axis=1) # 展平嵌套结构 flat_tuple_list = [item for row_items in nested_result for item in row_items]
3. 生成全新业务DataFrame
拿到展平后的总元组列表后,直接转换为带明确列名的DataFrame即可:
new_df = pd.DataFrame(flat_tuple_list, columns=['Keyword', 'Movie_Score'])
效果验证
上述代码执行后,flat_tuple_list的内容完全匹配预期:
[('adventure', 7.4), ('fun', 7.4), ('fiction', 7.4), ('ogre', 7.4), ('castle', 7.4), ('heroes', 3.4), ('family', 3.4), ('fun', 3.4), ('entertaining', 3.4), ('exciting', 3.4), ('prison', 9.1), ('emotional', 9.1), ('thrilling', 9.1), ('entertaining', 9.1), ('classic', 9.1)]
整套逻辑没有引入额外依赖,可直接适配500行规模的业务数据集处理,性能和稳定性都能满足正式环境要求。
内容的提问来源于stack exchange,提问作者BCmonitor
相关产品推荐
相关产品推荐

