我有许多
DataFrame
,每个都有相同的行数。 input_df
包含输入数据,param_df
包含用于计算的参数,output_df
包含输出数据。 param_df
中的一列包含应应用于每一行的函数。
在下面的简单 MWE 中,我们希望其中一个函数应用于前五行,另一个函数应用于最后五行。
我的问题是如何在没有笨拙的列表理解的情况下做到这一点?看来我应该能够使用
map
或 apply
之类的东西,但我还没有弄清楚如何在每行基础上应用可调用。
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"])
output_df = pd.DataFrame(data=[np.nan for row in range(10)],
columns=["VCLGR"])
param_df = pd.DataFrame(data=[[5, 10] for row in range(10)],
columns=["x", "y"])
# Add the callables to the param_df
param_df["method"] = func_1
param_df.loc[5:, "method"] = func_2
# Compute the output for each row using the function specified
output_df["VCLGR"] = [param_df["method"][i](input_df["GR"][i], param_df["x"][i], param_df["y"][i]) for i in range(len(input_df))]
您可以使用一个以数据帧行作为参数的函数,并使用它来调用存储在数据帧中的函数...
def indirect(row):
return row['method'](row['GR'], row['x'], row['y'])
output_df["VCLGR_2"] = pd.concat(
[
param_df,
input_df
],
axis=1
).apply(
indirect,
axis=1
)