
本文探讨了如何在Pandas DataFrame中为每行应用不同的可调用函数,解决了当计算逻辑依赖于行特定参数(包括函数本身)时的挑战。通过结合相关数据框,并利用`DataFrame.apply()`方法与一个接收整行作为参数的辅助函数,可以优雅且高效地实现这一需求,避免了低效的列表推导式。
在数据分析和处理中,我们经常需要对Pandas DataFrame中的数据执行操作。通常,这些操作是向量化的,即对整列应用相同的函数。然而,在某些复杂场景下,每行的计算逻辑可能不同,甚至需要应用不同的函数。例如,一个DataFrame包含输入数据,另一个包含计算参数,而第三个DataFrame则指定了每行应使用的具体函数。如何优雅地处理这种“行级函数分派”是Pandas用户面临的一个常见问题。
假设我们有三个DataFrame:input_df 包含待处理的原始数据,param_df 包含计算所需的参数,而 param_df 中还额外包含了一列,指定了对每行数据进行操作的具体函数。我们的目标是根据 param_df 中指定的函数和参数,计算并填充 output_df。
考虑以下示例:
import pandas as pd
import numpy as np
# 定义两个不同的函数
def func_1(in_val, a, b):
    return in_val + a + b
def func_2(in_val, a, b):
    return in_val + (2 * (a + b))
# 准备输入数据
input_df = pd.DataFrame(data=[1 for row in range(10)],
                        columns=["GR"])
# 准备输出DataFrame,初始为空
output_df = pd.DataFrame(data=[np.nan for row in range(10)],
                         columns=["VCLGR"])
# 准备参数DataFrame,包含计算所需的参数
param_df = pd.DataFrame(data=[[5, 10] for row in range(10)],
                        columns=["x", "y"])
# 向参数DataFrame中添加可调用函数,前5行使用func_1,后5行使用func_2
param_df["method"] = func_1
param_df.loc[5:, "method"] = func_2
print("Input DataFrame (input_df):\n", input_df)
print("\nParameter DataFrame (param_df):\n", param_df)在这个场景中,一个直观但不够“Pandas风格”的解决方案是使用列表推导式:
# 使用列表推导式计算输出
output_df["VCLGR_list_comp"] = [param_df["method"][i](input_df["GR"][i], param_df["x"][i], param_df["y"][i])
                                for i in range(len(input_df))]
print("\nOutput DataFrame (using list comprehension):\n", output_df)虽然列表推导式可以实现功能,但它打破了Pandas的向量化操作范式,对于大型数据集而言,可能效率较低且代码可读性不佳。我们寻求一种更符合Pandas哲学的方法。
Pandas提供了 DataFrame.apply() 方法,它可以在DataFrame的行或列上应用一个函数。当 axis=1 时,apply 会将DataFrame的每一行作为Series传递给指定的函数。这为我们解决上述问题提供了思路:
下面是具体的实现:
# 1. 定义一个辅助函数,它接收一整行数据作为输入
def indirect_callable_executor(row):
  """
  根据行中的'method'、'GR'、'x'和'y'字段执行相应的计算。
  """
  return row['method'](row['GR'], row['x'], row['y'])
# 2. 合并input_df和param_df,使每行包含所有必要信息
# axis=1 表示按列合并
combined_df = pd.concat([param_df, input_df], axis=1)
# 3. 使用apply(axis=1)将辅助函数应用到合并后的DataFrame的每一行
output_df["VCLGR_apply"] = combined_df.apply(indirect_callable_executor, axis=1)
print("\nCombined DataFrame for apply:\n", combined_df)
print("\nOutput DataFrame (using apply):\n", output_df)indirect_callable_executor(row) 函数:
pd.concat([param_df, input_df], axis=1):
combined_df.apply(indirect_callable_executor, axis=1):
这种方法的优势包括:
当需要在Pandas DataFrame的每行应用不同的可调用函数时,通过将所有相关数据(包括函数本身)合并到一个DataFrame中,并结合 DataFrame.apply(axis=1) 和一个接收行数据的辅助函数,可以构建一个优雅、灵活且高效的解决方案。这种方法不仅提升了代码的可读性和可维护性,也更好地融入了Pandas的数据处理生态系统。
以上就是在Pandas DataFrame中为每行应用不同的可调用函数的详细内容,更多请关注php中文网其它相关文章!
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号