繁体   English   中英

如何将 function 应用于 Pandas 中的数据帧列表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM