如何基于pandas列值调用python函数,其中调用的函数返回一个嵌套框?

neskvpey  于 9个月前  发布在  Python
关注(0)|答案(4)|浏览(128)

我有一个pandas dataframe,其中列出了项目,他们的销售地点,以及模型,使上述项目最低的Map出所有模型运行。
这是一个什么样的DF看起来像一个样本。

import pandas as pd
model = ['autoarima', 'prophet', 'TES']
item = ['102354','215898','302584']
MAPE = [46.2, 23.5, 15.6]
location = ['KR_DC', 'KR_DC','KR_DC']
df_dict = {'fcast_item':item, 'location':location, 'mape':MAPE, 'best_model':model}
df = pd.DataFrame.from_dict(df_dict)

字符串
我想使用model的值来调用存储在类中的模型函数,并运行返回一个嵌套框的函数。
例如,如果模型是'TES',那么我希望运行以下代码行:

df = [statmod.stats_models(df).tesa_model(target='corrected_demand', combo = combo, length=length_) for combo in combos]


如果模型是autoarima,则将运行以下命令

df = [statmod.stats_models(df).arima_model(target='corrected_demand', combo = combo, length=length_) for combo in combos]


如果有帮助的话,以下内容将始终相同:df = [statmod.stats_models(df).(target='corrected_demand', combo = combo, length=length_) for combo in combos]。只有中间,即模型函数本身所在的位置会改变。
我从来没有做过这种类型的动态编码,其中一个框架值调用一行代码来运行。这可能吗?

t9eec4r0

t9eec4r01#

你可以尝试使用Python内置的exec函数,沿着f字符串,每当我必须像这样做一些动态编码时(我不是一个专业的Python程序员,所以可能有一个更有效的方法来解决这类问题)
下面是一个示例代码:

exec(f"new_dataframe = statmod.stats_models(df).{"Your model name here"}_model(target='corrected_demand', combo = combo, length=length_) for combo in combos")

字符串
您可能需要对通过原始df获得的模型值进行一些处理,或者更改这些df中的值以匹配函数名。(例如:df值为“autoarima”,但您的函数名为“arima_model”,因此将此值提供给exec函数将“autoarima_model”)

7kjnsjlb

7kjnsjlb2#

您可以使用pandas中的apply方法来根据特定列中的值调用Python函数。在本例中,使用apply方法将custom_function应用于'Age'列。结果存储在名为'Age_Status'的新列中。custom_function检查年龄是否小于30,如果为true,则返回'Young',否则返回'Not Young'。
您可以使用自己的函数替换custom_function,并根据感兴趣的列中的值调整逻辑。这种方法非常灵活,允许您使用任何自定义函数来处理DataFrame列。

k75qkfdt

k75qkfdt3#

import pandas as pd

data = {'column_name': ['function1', 'function2', 'function1', 'function2']}
df = pd.DataFrame(data)

def function1():
    print("Calling Function 1")

def function2():
    print("Calling Function 2")

function_mapping = {
    'function1': function1,
    'function2': function2,
}

df['result'] = df['column_name'].apply(lambda x: function_mapping[x]())

字符串
输出结果:

print(df)

xam8gpfp

xam8gpfp4#

这里有两个返回类似结果的选项。不同之处在于缺少的值,但我相信这也可以指定。

v1 = [1,2,3]
v2 = ['a','b','c']
tmp_data = {'Val1': v1, 'Val2': v2}
df_tmp1 = pd.DataFrame.from_dict(tmp_data)

df_tmp_a = pd.DataFrame.from_dict({'ValA': [1,2]})
df_tmp_b = pd.DataFrame.from_dict({'ValB': [3,4]})

tmp_map = {'a': df_tmp_a, 'b': df_tmp_b}

def tmp_return_dict(row, dict_map):
    v = row['Val2']
    return_df = None
    try:
        return_df = dict_map[v]
    except KeyError:
        pass

    row['FrameRef'] = return_df
    return row

df_tmp1['FrameRef'] = df_tmp1['Val2'].map(tmp_map)
df_tmp2 = df_tmp1.apply(lambda x: tmp_return_dict(x, tmp_map), axis=1)

字符串
返回的框架存储在'FrameRef'列中。dt_tmp1为c返回NaN,dt_tmp2为c返回None。如果你只是通过字典Map,那么我相信.map()是预期的方法。
你也可以对一个系列使用.apply(),但我没有特别的原因,使用了行版本。

相关问题