Python中基于多DataFrame行列表逐行应用函数的问题
问题解决:DataFrame逐行传参到多参数函数的错误修复
错误原因
你遇到的<lambda>() missing 2 required positional arguments错误,本质是:
out2.apply(axis=1)仅会把当前行的Series作为唯一参数传给lambda,但你的lambda定义了3个参数,参数数量不匹配;- 更关键的是
out2是空DataFrame,本身不包含tsol、rfsol、rbsol的行数据,无法从这里获取需要的参数。
正确实现方案
方案1:用zip遍历多DataFrame的行(高效直观)
直接通过zip同步遍历三个DataFrame的每行,将每行转成列表后传入函数:
import pandas as pd t=[1,2,3,4,5] rf=[6,7,8,9,10] rb=[11,12,13,14,15] def simple_func(t, rf, rb): x=sum(t) y=sum(rf) z=sum(rb) return x+y+z # 构造示例DataFrame tsol=pd.DataFrame([t]*10) rfsol=pd.DataFrame([rf]*10) rbsol=pd.DataFrame([rb]*10) # 同步遍历三个DataFrame的每行,应用函数 results = [] for t_row, rf_row, rb_row in zip(tsol.itertuples(index=False), rfsol.itertuples(index=False), rbsol.itertuples(index=False)): results.append(simple_func(list(t_row), list(rf_row), list(rb_row))) out2 = pd.DataFrame({'output': results})
方案2:合并DataFrame后用apply(适合依赖apply的场景)
如果坚持要用apply,可以先把三个DataFrame合并,再从合并后的每行中提取对应列转成列表:
import pandas as pd t=[1,2,3,4,5] rf=[6,7,8,9,10] rb=[11,12,13,14,15] def simple_func(t, rf, rb): x=sum(t) y=sum(rf) z=sum(rb) return x+y+z # 构造示例DataFrame tsol=pd.DataFrame([t]*10) rfsol=pd.DataFrame([rf]*10) rbsol=pd.DataFrame([rb]*10) # 合并三个DataFrame,给列加前缀区分来源 combined_df = pd.concat( [tsol.add_prefix('t_'), rfsol.add_prefix('rf_'), rbsol.add_prefix('rb_')], axis=1 ) # 对合并后的每行应用函数,提取对应列转成列表 out2 = combined_df.apply( lambda row: simple_func( t=row.filter(like='t_').tolist(), rf=row.filter(like='rf_').tolist(), rb=row.filter(like='rb_').tolist() ), axis=1 ).to_frame(name='output')
两种方案最终都会生成一个长度为10、所有值为120的output列DataFrame,符合需求。
内容的提问来源于stack exchange,提问作者Joe Roberts
相关产品推荐
相关产品推荐

