[英]How to apply a function to a list of dataframes in Pandas
我有一个具有相同结构的数据框列表:
list_df = [df1,df2]
每个 dataframe 都有这样的结构:
df1=pd.DataFrame([2020-02,2020-01],['PC','PC'],[0.6,1.4],[0.5,1.3], columns=['Date', 'platform', "Day 1","Day 7"])
df2=pd.DataFrame([2020-02,2020-01],['Mobile','Mobile'],[0.6,1.2],[0.5,1.8], columns=['Date', 'platform', "Day 1","Day 7"])
我想应用一个自定义的 function,里面有几个条件。 当我尝试只运行条件,而不运行 function 时,它被应用于列表的每个数据帧,运行完美。 但是,当我将它用作 function 时,它不起作用,因为它仅应用于列表的第一个 dataframe。
这些是我一直在使用的代码:
for i in range(len(list_df)):
r2_tester(df_r2, eq_name, list_df[i], list_days)
new_df_list = []
for df in list_df:
new_df_list.append((r2_tester(df_r2,eq_name,list_df,list_days)))
r2_tester 是我指的 function。 r2_tester 是运行不同条件的 function,根据其他表的值计算一个或另一个曲线拟合。
但是,它们都有相同的问题:function 仅应用于第一个 dataframe。我在循环中做错了什么? 由于条件在 function 之外完美运行,我认为问题应该在那里。
r2_tester function 的代码:
def r2_tester(df_r2, eq_name, list_df, list_days):
if eq_name == df_r2.columns[1]:
for z in range(len(list_df)):
x = list_df[z]['days']
y = list_df[z]['value_a']
pars, cov = curve_fit(f=base_f, xdata=x, ydata=y, p0=[0.5, 0.5, 0.5,0.5], bounds=(-np.inf, np.inf))
b = pars[0]
k = pars[1]
s = pars[2]
l = pars[3]
for x in range(len(list_days)):
df_row1 = {'days':list_days[x], 'platform':list_df[z].iloc[0].values[0], 'date_month':list_df[z].iloc[0].values[1],}
list_df[z] = list_df[z].append(df_row1, ignore_index = True)
day = base_f(list_days[x], b, k, s, l)
list_df[z].iloc[-1,3] = day
return list_df
elif eq_name == df_r2.columns[2]:
for z in range(len(list_df)):
x = list_df[z]['days']
y = list_df[z]['value_a']
pars, cov = curve_fit(f=linear_f, xdata=x, ydata=y, p0=[0.5, 0.5, 0.5,0.5], bounds=(-np.inf, np.inf))
b = pars[0]
k = pars[1]
s = pars[2]
l = pars[3]
for x in range(len(list_days)):
df_row1 = {'days':list_days[x], 'platform':list_df[z].iloc[0].values[0], 'date_month':list_df[z].iloc[0].values[1],}
list_df[z] = list_df[z].append(df_row1, ignore_index = True)
day = linear_f(list_days[x], b, k, s, l)
list_df[z].iloc[-1,3] = day
return list_df
elif eq_name == df_r2.columns[3]:
for z in range(len(list_df)):
x = list_df[z]['days']
y = list_df[z]['value_a']
pars, cov = curve_fit(f=exp_f, xdata=x, ydata=y, p0=[0.5, 0.5, 0.5,0.5], bounds=(-np.inf, np.inf))
b = pars[0]
k = pars[1]
s = pars[2]
l = pars[3]
for x in range(len(list_days)):
df_row1 = {'days':list_days[x], 'platform':list_df[z].iloc[0].values[0], 'date_month':list_df[z].iloc[0].values[1],}
list_df[z] = list_df[z].append(df_row1, ignore_index = True)
day = exp_f(list_days[x], b, k, s, l)
list_df[z].iloc[-1,3] = day
return list_df
elif eq_name == df_r2.columns[4]:
for z in range(len(list_df)):
x = list_df[z]['days']
y = list_df[z]['value_a']
pars, cov = curve_fit(f=exp_l_f, xdata=x, ydata=y, p0=[0.5, 0.5, 0.5,0.5], bounds=(-np.inf, np.inf))
b = pars[0]
k = pars[1]
s = pars[2]
l = pars[3]
for x in range(len(list_days)):
df_row1 = {'days':list_days[x], 'platform':list_df[z].iloc[0].values[0], 'date_month':list_df[z].iloc[0].values[1],}
list_df[z] = list_df[z].append(df_row1, ignore_index = True)
day = exp_l_f(list_days[x], b, k, s, l)
list_df[z].iloc[-1,3] = day
return list_df
我无法连接数据帧,因为我已经在数据帧列表上创建了 function。
谢谢!
IIUC 使用:
new_df_list = []
for df in list_df:
new_df_list.append((r2_tester(df_r2,eq_name,df,list_days)))
或者:
new_df_list = [r2_tester(df_r2,eq_name,df,list_days) for df in list_df]
编辑:如果 function 使用 DataFrame 列表使用:
new_df_list = r2_tester(df_r2, eq_name, list_df, list_days)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.