在这种情况下如何使用功能?

时间:2014-11-04 09:26:49

标签: python pandas

我有一个Pandas数据框,想要用它做不同的事情。现在我的函数有这个结构:

def process_dataframe(df, save_to_file, print_to_screen, etc):
    ...
    if save_to_file:
        df.to_csv(filename)
    elif print_to_screen:
        print df
    elif...

这是一个丑陋的if else案例。我想用功能代替。一个函数指针。像这样的东西。我创建了几个函数:

def save_to_file(df, filename):
    return create_function(to_csv, filename???)
def print_to_screen(df):
    return create_function(print)

这意味着我可以将我的函数结构改为这一行:

result = process_dataframe(save_to_file)
...
...
def process_dataframe(df, my_functional):
    return my_functional(df)

问题是我不懂语法。例如,如何在“save_to_file()”中返回类成员函数“.to_csv”? “save_to_file()”如何?它需要哪个args?

当然,我可以使用lambda而不是定义每个函数。但我想先了解如何定义函数。使用lambdas的下一步,我可以弄清楚自己。

2 个答案:

答案 0 :(得分:1)

我确定这实际上是你想要做的,但假设它是,你可以编写一个调用函数的函数(并通过参数传递),如下所示:

def process_df(df, function, *args, **kwargs):
    function(df, *args, **kwargs)

定义你的两个动作。

def print_to_screen(df):
    print df

def save_to_file(df, filename):
    df.to_csv(filename)

然后你可以随意使用它们:

In [193]: df = pd.DataFrame([[1,2,3],[2,4,5]], columns=['a','b','c'])

In [197]: process_df(df, print_to_screen)
   a  b  c
0  1  2  3
1  2  4  5

In [198]: process_df(df, save_to_file, 'temp.csv')
#writes temp.csv

答案 1 :(得分:0)

  

问题是我不懂语法。例如,如何   返回“save_to_file()?”

中的类成员函数“.to_csv”

我认为你问的是:

def save_to_file(filename):
    def df_to_csv(df):
        return df.to_csv(filename)
return df_to_csv

电话:

foo = save_to_file('myfile.csv')
foo(df)  # <- here "df" will be saved to "myfile.csv"

您也可以这样做(我认为这是您最初想要的):

def save_to_file(df, filename):
    def df_to_csv():
       return df.to_csv(filename)
return df_to_csv

然后这样称呼它:

foo = save_to_file(df, 'myfile.csv')
foo()  # <- "df" is saved to "myfile.csv"

但对我来说,这似乎并不比第一个解决方案难看,所以你可能想重新考虑一下你的方法。