如何高效在Pandas DataFrame各行应用函数并将返回值转为列?
高效将返回字典的函数应用到Pandas DataFrame每行并扩展列
需求场景
需要将一个返回字典的函数应用到Pandas DataFrame的每一行,把字典中的键作为新列名、值作为对应列的内容,合并到原DataFrame中。示例代码如下:
import pandas as pd def fu(myArg): return {"one":myArg,"two":20} li = [10,20] df = pd.DataFrame(li,columns=["myArg"])
期望输出结果:
myArg one two 0 10 10 20 1 20 20 20
高效实现方法
方法一:apply结合pd.Series快速扩展列
利用apply将函数作用于目标列的每个元素,把返回的字典转为pd.Series生成新的DataFrame,再通过join合并到原DataFrame:
# 生成函数返回结果的DataFrame func_result = df['myArg'].apply(lambda x: pd.Series(fu(x))) # 合并原DataFrame和结果DataFrame result_df = df.join(func_result)
这种方法简洁直观,适合函数仅依赖单个列的场景。
方法二:针对整行数据的函数应用
如果函数需要使用整行的多个字段作为参数,可指定apply的axis=1参数作用于每行,再转为pd.Series:
# 修改函数以接收整行数据 def fu_row(row): return {"one": row['myArg'], "two": 20} # 应用函数并合并结果 func_result = df.apply(fu_row, axis=1).apply(pd.Series) result_df = df.join(func_result)
方法三:矢量化操作优化性能
如果函数逻辑可以拆解为Pandas矢量化操作,完全可以避免逐行处理,性能会大幅提升。比如示例中one列等于myArg,two列是固定值20,直接赋值即可:
result_df = df.copy() result_df['one'] = result_df['myArg'] result_df['two'] = 20
这种方式是Pandas中性能最优的方案,适合有固定逻辑或可矢量化的场景。
内容的提问来源于stack exchange,提问作者Fredrik Nylén
相关产品推荐
相关产品推荐

