我正在为 Pandas Dataframe 编写自定义访问器类 - 我已经按照此处的示例进行操作并取得了积极的成果。但是我有一个函数,我想在其中传递额外的参数。
我在访问器类中创建了这个函数:
@property
def accessor_function(self, time_window=0.5):
def group_function(df, time):
fl = df.loc[df.Type_num==0]
id = fl.Time.idxmin()
threshold = df.loc[id, 'column'] + time
return fl.loc[fl.Time<threshold]
self.Subset = self._obj.groupby(by['col_1','col_2']).apply(group_function, time_window)
self.Subset.reset_index(drop=True, inplace=True)
return self.Subset
如果我这样调用它,它可以使用 time_window=0.5
:
df.accessor.accessor_function
但是,如果我想为关键字参数传递不同的值:
df.accessor.accessor_function(time_window = 1)
我得到一个错误:
TypeError: 'DataFrame' object is not callable
我找不到任何明显的文档来解释将 args
或 kwargs
传递给自定义访问器。所以我不确定我正在尝试的是否有可能。但最好了解如何前进。
本
最佳答案
我相信这与您使用 porperty
装饰器这一事实有关,而实际上您有一个方法。如果您删除它,它应该可以正常工作,请参见下面的示例:
import pandas as pd
@pd.api.extensions.register_dataframe_accessor("accessor")
class MyAccessor:
def __init__(self, pandas_obj):
self._obj = pandas_obj
def accessor_function(self, time_window=0.5):
def group_function(df, time):
fl = df.loc[df.Type_num==0]
id = fl.Time.idxmin()
threshold = df.loc[id, 'column'] + time
return fl.loc[fl.Time<threshold]
self.Subset = self._obj.groupby(['col_1','col_2']).apply(group_function, time_window)
self.Subset.reset_index(drop=True, inplace=True)
return self.Subset
默认大小写是:
>>> a = pd.DataFrame({'Type_num': [False, False,False,False,False],
'Time': [1, 2, 0.1, 0.2, 0.5],
'col_1': ['A', 'B', 'C', 'D', 'E'],
'col_2': ['A', 'A', 'C', 'E', 'E'],
'column': [0.2, 0.2,0.2, 0.2,0.2]})
>>> a.accessor.accessor_function()
Type_num Time col_1 col_2 column
0 False 0.1 C C 0.2
1 False 0.2 D E 0.2
2 False 0.5 E E 0.2
您可以使用自定义的time_window
>>> a.accessor.accessor_function(time_window=1)
Type_num Time col_1 col_2 column
0 False 1.0 A A 0.2
1 False 0.1 C C 0.2
2 False 0.2 D E 0.2
3 False 0.5 E E 0.2
或者使用 *arg
或 **kwargs
传递该参数:
>>> a.accessor.accessor_function(*[2])
Type_num Time col_1 col_2 column
0 False 1.0 A A 0.2
1 False 2.0 B A 0.2
2 False 0.1 C C 0.2
3 False 0.2 D E 0.2
4 False 0.5 E E 0.2
>>> a.accessor.accessor_function(**{'time_window':0.1})
Type_num Time col_1 col_2 column
0 False 0.1 C C 0.2
1 False 0.2 D E 0.2
关于python - 将附加参数传递给 Pandas 自定义访问器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56479503/