我想写一个装饰器,我可以在为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中已定义的装饰器,但似乎没有。
第一个问题:我该怎么做?
第二:是推荐,还是有更好的方法?
干杯
答案 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。