如何编写可与 pandas 方法链接一起使用的 python 函数
How to write a python function that can be used with pandas method chaining
这是我最初的方法:
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'
我认为这会得到很好的记录,但我无法在任何地方举出例子。
您正在尝试做的是所谓的猴子修补。您需要将函数编写为方法(它将 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
。
这是我最初的方法:
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'
我认为这会得到很好的记录,但我无法在任何地方举出例子。
您正在尝试做的是所谓的猴子修补。您需要将函数编写为方法(它将 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
。