装饰器将pandas系列传递到单列DataFrames

时间:2016-06-20 22:37:50

标签: python pandas python-decorators

我想写一个装饰器,我可以在为Pandas DataFrame编写的函数上使用,这样当它们收到一个实际上是Series(或者甚至是一个数组)的输入时,它首先将该输入转换为一个 - 列Pandas DataFrame的一般性。这样我就可以使每个函数仅适用于DataFrames的DataFrames和系列编写函数。

这样的东西
@wraps
def does_smt(df, **kwargs):
    for c in df.columns:
        df[c] = do_something(df[c], df.index)
    return df

does_smt(series) # and it also works

我对python装饰器还不太好,但是通过Pint的ureg.wraps装饰师判断,我认为可以做到。我检查了那个装饰,但是,再次,因为我无法理解装饰,我无法弄清楚如何适应装饰。我还搜索了一个像Pandas中已定义的装饰器,但似乎没有。

第一个问题:我该怎么做?

第二:是推荐,还是有更好的方法?

干杯

1 个答案:

答案 0 :(得分:1)

@First问题:我该怎么做?

import pandas as pd
from functools import wraps

def seriescapable(func):
    """Decorator for turning the first argument from a pandas.Series to a pandas.DataFrame."""
    @wraps(func)
    def wrapper(*args, **kwargs):
        if args and isinstance(args[0], pd.Series):
            return = func(pd.DataFrame(args[0]), *args[1:], **kwargs)
        return func(*args, **kwargs)
    return wrapper


# Usage example:

@seriescapable
def my_func(df):
    print type(df)
    print df

myfunc(pd.Series([1, 2]))

另见Python Cookbook: Putting a wrapper around a function

@Second问题:这是推荐的,还是有更好的方式?

我认为该程序没有根本问题。在语义上,它足够清楚,至少在PEP-318 -- Decorators for Functions and Methods中使用类型检查作为示例。它增加了一些处理开销,但与您在函数中执行的计算相比,这可能是微不足道的。作为参考,这里也是more general solution for automatic argument conversion