- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个计算 pandas 数据框列模式的函数:
def my_func(df):
for col in df.columns:
stat = df[col].mode()
print(stat)
但我想让它更通用,这样我就可以更改我计算的统计数据,例如mean, max,... 我试图将方法 mode() 作为参数传递给我的函数:
def my_func(df, pandas_stat):
for col in df.columns:
stat = df[col].pandas_stat()
print(stat)
引用:How do I pass a method as a parameter in Python
但是这似乎对我不起作用。使用一个简单的例子:
> A
a b
0 1.0 2.0
1 2.0 4.0
2 2.0 6.0
3 3.0 NaN
4 NaN 4.0
5 3.0 NaN
6 2.0 6.0
7 4.0 6.0
它不识别命令模式:
> my_func(A, mode)
Traceback (most recent call last):
File "<ipython-input-332-c137de83a530>", line 1, in <module>
my_func(A, mode)
NameError: name 'mode' is not defined
所以我尝试了 pd.DataFrame.mode:
> my_func(A, pd.DataFrame.mode)
Traceback (most recent call last):
File "<ipython-input-334-dd913410abd0>", line 1, in <module>
my_func(A, pd.DataFrame.mode)
File "<ipython-input-329-8acf337bce92>", line 3, in my_func
stat = df[col].pandas_stat()
File "/anaconda3/envs/py36/lib/python3.6/site-packages/pandas/core/generic.py", line 4376, in __getattr__
return object.__getattribute__(self, name)
AttributeError: 'Series' object has no attribute 'pandas_stat'
有没有办法传递模式函数?
最佳答案
您可以使用内置的 [getattr][1]
和 __name__
属性来执行此操作,但我想这会使您的代码有些不清楚。可能存在更好的方法。
df = pd.DataFrame({'col1': list(range(5)), 'col2': list(range(5, 0, -1))})
df
Out:
col1 col2
0 0 5
1 1 4
2 2 3
3 3 2
4 4 1
以这种方式定义 my_func
并将其应用于 df
:
def my_func(df, pandas_stat):
for col in df.columns:
stat = getattr(df[col], pandas_stat.__name__)()
print(stat)
my_func(df, pd.DataFrame.mean)
Out
2.0
3.0
说明:pd.DataFrame.mean
具有属性 __name__
,其值为 'mean'
。 getattr 可以从 pd.DataFrame
对象中获取此属性,然后您可以调用它。
如果需要,您甚至可以传递参数:
def my_func(df, pandas_stat, *args, **kwargs):
for col in df.columns:
stat = getattr(df[col], pandas_stat.__name__)(*args, **kwargs)
print(stat)
my_func(df, pd.DataFrame.apply, lambda x: x ** 2)
Out:
0 0
1 1
2 4
3 9
4 16
Name: col1, dtype: int64
0 25
1 16
2 9
3 4
4 1
Name: col2, dtype: int64
但我再说一遍,我想这种方法有点令人困惑。
编辑
关于错误:
> my_func(A, pd.DataFrame.mode)
Traceback (most recent call last):
File "<ipython-input-334-dd913410abd0>", line 1, in <module>
my_func(A, pd.DataFrame.mode)
File "<ipython-input-329-8acf337bce92>", line 3, in my_func
stat = df[col].pandas_stat()
File "/anaconda3/envs/py36/lib/python3.6/site-packages/pandas/core/generic.py", line 4376, in __getattr__
return object.__getattribute__(self, name)
AttributeError: 'Series' object has no attribute 'pandas_stat'
当执行 df[col].pandas_stat()
时,点 .
运算符调用数据帧对象的 __getattribute__
方法。它类似于 getattr
,但它会自动将 self
作为第一个参数。
因此,第二个是方法的“名称”,在您的代码中为 'pandas_stat'
。它中断了执行,因为 pandas dataframe 没有具有这样名称的属性。
如果您向 getattr
提供实际方法的正确名称('mean'、'apply' 等),此函数会在 pd.DataFrame.__dict__
中找到此方法> 列出所有方法的地方,并返回它。所以你可以通过 (*args, **kwargs)
语法调用它。
关于python - 如何将 pandas 方法作为参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54252875/
我是一名优秀的程序员,十分优秀!