在语句/代码块之前/之后重复执行相同的代码

时间:2019-01-11 10:14:30

标签: python python-3.x pandas

我正在过滤pandas.DataFrame中的某些数据,并想跟踪我松动的行。所以基本上,我想

df = pandas.read_csv(...)
n1 = df.shape[0]
df = ...  # some logic that might reduce the number of rows
print(f'Lost {n1 - df.shape[0]} rows')

现在有多个过滤步骤,其前后的代码始终相同。所以我正在寻找一种抽象方法。

首先想到的当然是装饰器-但是,我不喜欢仅用一个LOC创建一堆函数的想法。

我想出的是上下文管理器:

from contextlib import contextmanager

@contextmanager
def rows_lost(df):
    try:
        n1 = df.shape[0]
        yield df
    finally:
         print(f'Lost {n1 - df.shape[0]} rows')

然后:

with rows_lost(df) as df:
    df = ... 

我想知道是否有更好的解决方案?

修改: 我只是意识到,如果过滤器步骤返回一个新对象(这是pandas Dataframes的默认值),则上下文管理器方法将行不通。仅当对象“就地”修改时有效。

1 个答案:

答案 0 :(得分:0)

您可以编写一个“包装函数”来包装您指定的过滤器:

def filter1(arg):
    return arg+1

def filter2(arg):
    return arg*2

def wrap_filter(arg, filter_func):
    print('calculating with argument', arg)
    result = filter_func(arg)
    print('result', result)
    return result

wrap_filter(5, filter1)
wrap_filter(5, filter2)

使用装饰器可以改善的唯一一件事是,您可以选择在不使用包装器的情况下调用过滤器...