将附加参数传递给 Pandas 自定义访问器

BMi*_*ell 3 python pandas

我正在为 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
Run Code Online (Sandbox Code Playgroud)

如果我这样称呼它,它可以使用time_window=0.5

df.accessor.accessor_function
Run Code Online (Sandbox Code Playgroud)

但是,如果我想为关键字参数传递不同的值:

df.accessor.accessor_function(time_window = 1)
Run Code Online (Sandbox Code Playgroud)

我收到错误:

TypeError: 'DataFrame' object is not callable
Run Code Online (Sandbox Code Playgroud)

我找不到任何解释传递argskwargs自定义访问器的明显文档。所以我不确定我正在尝试的是否可能。但了解如何前进会很好。

use*_*787 5

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
Run Code Online (Sandbox Code Playgroud)

默认情况是:

>>> 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
Run Code Online (Sandbox Code Playgroud)

您可以使用自定义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
Run Code Online (Sandbox Code Playgroud)

*arg或者使用or传递该参数**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
Run Code Online (Sandbox Code Playgroud)