如何同时对两个DataFrame应用同一个lambda函数?
一行代码批量处理多个DataFrame的列
嘿,我来帮你搞定这个问题!你想要用一行代码同时给两个DataFrame的A列应用同一个lambda函数,其实有几个简单的方案,还能解决你用map时遇到的困惑。
方法1:直接修改原DataFrame(一行完成)
用列表推导式就能在一行内直接修改两个DataFrame的目标列,完全贴合你的需求:
[df['A'] = df['A'].apply(lambda x: float(x)) for df in [df1, df2]]
这个写法会遍历列表里的每个DataFrame,直接把它们的A列从字符串转成浮点型。虽然列表推导式通常用来生成列表,但这里利用它的迭代执行特性完成赋值操作,完美满足“一行代码”的要求。
方法2:用map生成新的DataFrame(不改动原数据)
如果你不想修改原DataFrame,而是生成新的副本,可以用map配合assign方法,记得要把map对象转换成列表(因为map是惰性迭代器,不迭代的话不会执行里面的函数):
new_df1, new_df2 = list(map(lambda df: df.assign(A=df['A'].apply(float)), [df1, df2]))
这样会得到两个全新的DataFrame,它们的A列已经转成浮点型,原df1和df2会保持原样。
你之前的map用法为啥不对?
你写的map(lambda x: x.query(float(x)), [df1, df2])有两个明显问题:
query方法是用来执行类SQL查询语句的,根本不是用来修改列数据的工具,这里完全用错了;map返回的是迭代器对象,必须通过list()或者遍历它才会触发里面的lambda函数执行,否则什么实际操作都不会发生。
测试验证示例
用你提供的测试数据来实操一遍(先确保A列是字符串类型):
import pandas as pd # 创建测试数据(A列为字符串格式) df1 = pd.DataFrame({'A': ['1', '2', '1', '1.5'], 'B': [1, 0, 2, 1], 'C': [2, 0, 2, 3]}) df2 = pd.DataFrame({'A': ['3', '4', '2.7', '3.1'], 'B': [1, 5, 2, 4]}) # 一行代码完成类型转换 [df['A'] = df['A'].apply(lambda x: float(x)) for df in [df1, df2]] # 验证转换结果 print(df1['A'].dtype) # 输出 float64 print(df2['A'].dtype) # 输出 float64
内容的提问来源于stack exchange,提问作者Rafael Ferreira
相关产品推荐
相关产品推荐

