Как написать функцию python, которую можно использовать с цепочкой pandas метода - PullRequest
0 голосов
/ 31 января 2020

Это мой первоначальный подход:

In [91]: def f(dataframe,col):
    ...:     dataframe[col] = dataframe[col]*0

Но это не удалось со следующим:

In [90]: df=pd.DataFrame({'a':[1,2],'b':[4,5]})

In [91]: def f(dataframe,col):
    ...:     dataframe[col] = dataframe[col]*0
    ...:

In [92]: df.f('a')
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-92-e1a104c6b712> in <module>
----> 1 df.f('a')

~/.virtualenvs/this-env/lib/python3.7/site-packages/pandas/core/generic.py in __getattr__(self, name)
   5177             if self._info_axis._can_hold_identifiers_and_holds_name(name):
   5178                 return self[name]
-> 5179             return object.__getattribute__(self, name)
   5180
   5181     def __setattr__(self, name, value):

AttributeError: 'DataFrame' object has no attribute 'f'

Я предполагал, что это будет довольно хорошо задокументировано, но я не могу пример где угодно.

1 Ответ

2 голосов
/ 31 января 2020

То, что вы пытаетесь сделать, называется исправлением обезьян. Вам нужно написать функцию как метод (в качестве первого параметра она будет иметь self), а затем назначить метод в качестве атрибута для pd.DataFrame class , а не для экземпляра объекта.

import pandas as pd

def f(self, col):
    self.loc[:, col] = self.loc[:, col] * 0
    return self

pd.DataFrame.f = f

df=pd.DataFrame({'a':[1,2],'b':[4,5]})
df.f('a')
# returns:
   a  b
0  0  4
1  0  5

Имейте в виду, что ваш метод в том виде, в котором он написан, изменит кадр данных на месте. Если вам нужно сохранить исходный фрейм данных, используйте .copy в верхней части вашей функции.

...