我的DataFrame.mean()中,为何缺了level参数
在网上翻看文档,是应该包含level参数的。
df2 = pd.DataFrame(np.random.randint(0,151,size=(20,3)),
columns=['Python','Math','En'],
index=pd.MultiIndex.from_product([list('ABCDEFGHIJ'),['期中','期末']]))
df2.mean(level = 1)
报错为:
TypeError Traceback (most recent call last)
Cell In[112], line 4
1 df2 = pd.DataFrame(np.random.randint(0,151,size=(20,3)),
2 columns=['Python','Math','En'],
3 index=pd.MultiIndex.from_product([list('ABCDEFGHIJ'),['期中','期末']]))
----> 4 df2.mean(level = 1)
File /Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/pandas/core/generic.py:11556, in NDFrame._add_numeric_operations.<locals>.mean(self, axis, skipna, numeric_only, **kwargs)
11539 @doc(
11540 _num_doc,
11541 desc="Return the mean of the values over the requested axis.",
(...)
11554 **kwargs,
11555 ):
> 11556 return NDFrame.mean(self, axis, skipna, numeric_only, **kwargs)
File /Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/pandas/core/generic.py:11201, in NDFrame.mean(self, axis, skipna, numeric_only, **kwargs)
11194 def mean(
11195 self,
11196 axis: Axis | None = 0,
(...)
11199 **kwargs,
11200 ) -> Series | float:
> 11201 return self._stat_function(
11202 "mean", nanops.nanmean, axis, skipna, numeric_only, **kwargs
11203 )
File /Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/pandas/core/generic.py:11154, in NDFrame._stat_function(self, name, func, axis, skipna, numeric_only, **kwargs)
11152 nv.validate_median((), kwargs)
11153 else:
> 11154 nv.validate_stat_func((), kwargs, fname=name)
11156 validate_bool_kwarg(skipna, "skipna", none_allowed=False)
11158 return self._reduce(
11159 func, name=name, axis=axis, skipna=skipna, numeric_only=numeric_only
11160 )
File /Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/pandas/compat/numpy/function.py:80, in CompatValidator.__call__(self, args, kwargs, fname, max_fname_arg_count, method)
78 validate_args(fname, args, max_fname_arg_count, self.defaults)
79 elif method == "kwargs":
---> 80 validate_kwargs(fname, kwargs, self.defaults)
81 elif method == "both":
82 validate_args_and_kwargs(
83 fname, args, kwargs, max_fname_arg_count, self.defaults
84 )
File /Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/pandas/util/_validators.py:162, in validate_kwargs(fname, kwargs, compat_args)
140 """
141 Checks whether parameters passed to the **kwargs argument in a
142 function `fname` are valid parameters as specified in `*compat_args`
(...)
159 map to the default values specified in `compat_args`
160 """
161 kwds = kwargs.copy()
--> 162 _check_for_invalid_keys(fname, kwargs, compat_args)
163 _check_for_default_values(fname, kwds, compat_args)
File /Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/pandas/util/_validators.py:136, in _check_for_invalid_keys(fname, kwargs, compat_args)
134 if diff:
135 bad_arg = list(diff)[0]
--> 136 raise TypeError(f"{fname}() got an unexpected keyword argument '{bad_arg}'")
TypeError: mean() got an unexpected keyword argument 'level'
参见官方文档:https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.mean.html
也可以看看函数的类型实现:
def mean(
self,
axis: Axis | None = ...,
skipna: _bool | None = ...,
level: None = ..., # 类型标注为 None,已废弃
numeric_only: _bool = ...,
**kwargs,
) -> Series: ...
这个参数已经被 axis 替代了,所以会报错
在 DataFrame.mean() 方法中缺少 level 参数可能是由于 Pandas 版本的问题。如果使用的是较早版本的 Pandas,该方法可能没有 level 参数。如果要使用 level 参数,可以升级到较新的 Pandas 版本,或者使用 Pandas 的多级索引(MultiIndex)来实现类似的功能。
报错的具体原因需要查看错误信息,可以通过查看错误信息定位问题所在,例如是否输入了不合法的参数或缺少必要的参数等等。如果报错信息不够清晰,可以尝试通过调试工具或打印调试信息来查找问题。
以下是使用 Pandas 的多级索引来实现类似的功能的示例代码:
import pandas as pd
# 构造一个包含多级索引的 DataFrame
data = {
('A', 'B'): [1, 2, 3],
('A', 'C'): [4, 5, 6],
('D', 'E'): [7, 8, 9]
}
index = pd.Index(['x', 'y', 'z'], name='idx1')
columns = pd.MultiIndex.from_tuples([('A', 'B'), ('A', 'C'), ('D', 'E')], names=['col1', 'col2'])
df = pd.DataFrame(data, index=index, columns=columns)
# 对第一级索引计算平均值
mean_level1 = df.mean(level='idx1')
print(mean_level1)
# 对第二级索引计算平均值
mean_level2 = df.mean(level='col2', axis=1)
print(mean_level2)
运行结果:
col1 A D
col2 B C E
idx1
x 1.0 4.0 7.000
y 2.0 5.0 8.000
z 3.0 6.0 9.000
idx1
x 4.0
y 5.0
z 6.0
dtype: float64
这里使用了一个包含多级索引的 DataFrame 对象,并使用 DataFrame.mean() 方法和 level 参数对其中的数据进行了计算。mean_level1 中返回的是针对第一级索引的平均值,mean_level2 中返回的是每一行对应的第二级索引的平均值。需要注意的是,level 参数使用时需要指定要对哪一级索引进行计算,且该索引应为该 DataFrame 对象的一个有效层级。