任何人都可以解释为什么 pandas 不使用参数 axis=None 在两个轴上求和。正如 API 参考中所说:
pandas.DataFrame.sum
DataFrame.sum(axis=None, Skipna=True, numeric_only=False, min_count=0, **kwargs)
这相当于方法numpy.sum
参数:axis : {index (0), columns (1)}
Axis for要应用的函数。对于 Series,此参数未使用,默认为 0。
对于 DataFrame,指定axis=None将在两个轴上应用聚合。
但是当我使用参数 axis=None 时,它的工作原理与 axis=0 相同
import pandas as pd
df = pd.DataFrame({'a':[1,2,3], 'b':[4,6,8]})
df
Run Code Online (Sandbox Code Playgroud)
Output:
a b
0 1 4
1 2 6
2 3 8
Run Code Online (Sandbox Code Playgroud)
df.sum(axis=None)
Run Code Online (Sandbox Code Playgroud)
Output:
a 6
b 18
dtype: int64
Run Code Online (Sandbox Code Playgroud)
等同于:
df.sum(axis=0)
Run Code Online (Sandbox Code Playgroud)
Output:
a 6
b 18
dtype: int64
Run Code Online (Sandbox Code Playgroud)
它不应该像 numpy.sum() 一样工作吗?
import numpy as np
df.to_numpy().sum()
Run Code Online (Sandbox Code Playgroud)
Output:
24
Run Code Online (Sandbox Code Playgroud)
当出现此类故障时,一种可能的解决方案是读取代码。让我们研究一下源代码,pandas.DataFrame.sum代码是
def sum(
self,
axis: Axis | None = None,
skipna: bool_t = True,
numeric_only: bool_t = False,
min_count: int = 0,
**kwargs,
):
return NDFrame.sum(self, axis, skipna, numeric_only, min_count, **kwargs)
Run Code Online (Sandbox Code Playgroud)
这提示查询NDFrame.sum实际上是
def sum(
self,
axis: Axis | None = None,
skipna: bool_t = True,
numeric_only: bool_t = False,
min_count: int = 0,
**kwargs,
):
return self._min_count_stat_function(
"sum", nanops.nansum, axis, skipna, numeric_only, min_count, **kwargs
)
Run Code Online (Sandbox Code Playgroud)
这提示询问什么_min_count_stat_function是
@final
def _min_count_stat_function(
self,
name: str,
func,
axis: Axis | None = None,
skipna: bool_t = True,
numeric_only: bool_t = False,
min_count: int = 0,
**kwargs,
):
if name == "sum":
nv.validate_sum((), kwargs)
elif name == "prod":
nv.validate_prod((), kwargs)
else:
nv.validate_stat_func((), kwargs, fname=name)
validate_bool_kwarg(skipna, "skipna", none_allowed=False)
if axis is None:
axis = self._stat_axis_number
return self._reduce(
func,
name=name,
axis=axis,
skipna=skipna,
numeric_only=numeric_only,
min_count=min_count,
)
Run Code Online (Sandbox Code Playgroud)
观察if存在,它确实将轴值设置为,其本身axis先前设置为零None_stat_axis_number
_stat_axis_number = 0
Run Code Online (Sandbox Code Playgroud)
并且在可用源代码的任何其他地方都不会更改(它似乎被视为只读),因此给出None作为轴值与给出相同0。
文档与代码实际执行的操作不相符。