首页 > 解决方案 > 如何在每个循环中遍历python pandas中的不同函数/过滤方法(或不同语句)

问题描述

我想在我的代码中循环遍历不同的过滤器方法。

这就是我的代码的样子。

import datetime
import pandas as pd
import sqlalchemy

engine = sqlalchemy.create_engine(..................)

datelist = [ datetime.date(2021, 5, 10),
 datetime.date(2021, 5, 11),
 datetime.date(2021, 5, 12),
 datetime.date(2021, 5, 13),
 datetime.date(2021, 5, 14),
 datetime.date(2021, 5, 17),
 datetime.date(2021, 5, 18),
 datetime.date(2021, 5, 19)]

for date in datelist:
    dfr = pd.read_sql(f"select * from frame1 where date = '{date}'",index_col='date',con=engine)
    dfr = dfr.pivot_table(columns='line')
    dfc = pd.read_sql(f"select * from frame2 where date = '{date}'",index_col='date',con=engine)
    dfc = dfc.pivot_table(columns='line')
    dff = dfr.append(dfc)
    dff.columns = [x.lower() for x in dff.columns]
    
    ### want to for loop this part with a different statement everytime
    dff.loc['test', :] = dff.loc['indicator1'].ge(0).eq(dff.loc['indicator2']) 
    dff = dff.loc[:,(dff.loc['indicator3']>0)]
    ### until here

    indicator = dff.loc["indicator3",:]
    dictionary = list(future_returns.to_dict().keys())
    
    some_save_functions()

如果你看一下评论部分,我想在那里循环各种过滤方法。

以下是我想尝试的不同过滤方法的示例。

功能1

dff.loc['test', :] = dff.loc['indicator1'].ge(0).eq(dff.loc['indicator2']) 
dff = dff.loc[:,(dff.loc['indicator3']>0)]

功能2

dff.loc['test', :] = dff.loc['indicator6'].ge(0).eq(dff.loc['indicator7']) 
dff = dff.loc[:,(dff.loc['test']==True) & (dff.loc['indicator3']>0)]

功能3

...... 
......

这些陈述每次看起来都可能非常不同。

我上面有 8 个日期,我有 6 个过滤方法。最后我想保存 8 x 6 帧。

这可以做到吗?我不知道。我只循环过变量,从来没有不同的语句。

我正在考虑使用一个类或为每个过滤器定义一个函数,但我也不知道如何遍历这些。有没有办法用python做到这一点?

标签: pythonpandasfunctionloops

解决方案


如果您将每个过滤方法转换为将返回单个数组或列表的function(),则可以使用以下格式的 for 循环替换注释块:

# List of filtering functions as strings without the ()
list_of_methods = ["np.sum", "np.mean", "np.std"]

for method in list_of_methods:
    # Converts each method into the filtering_function() at a time
    exec("filtering_function = " + method)
    
    # Appends the resulting list of results fomr the filtering_function() to the original dataset
    dff[method] = filtering_function(dff)

最后,您将拥有一个包含与过滤函数一样多的列的 DataFrame。您甚至可以使用以下代码块将列附加到 DataFrame 时自定义列的名称:

col_name = method + "_results"
dff[col_name] = filtering_function(dff)

推荐阅读