为什么使用 axis=None 参数时 pandas.sum() 不能跨两个轴工作?

Ale*_*nik 7 python sum pandas

任何人都可以解释为什么 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)

Daw*_*weo 3

当出现此类故障时,一种可能的解决方案是读取代码。让我们研究一下源代码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

文档与代码实际执行的操作不相符。