我正在过滤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的默认值),则上下文管理器方法将行不通。仅当对象“就地”修改时有效。
答案 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)
使用装饰器可以改善的唯一一件事是,您可以选择在不使用包装器的情况下调用过滤器...