axis = 0 似乎在 sum() 和 dropna() 中表现不同

问题描述 投票:0回答:4

通过阅读 pandas 文档以及一个很好的问答(pandas 中的 axis 是什么意思?),我预计 axis=0 始终意味着相对于列。当我使用 sum() 时,这对我有用,但当我使用 dropna() 调用时,这对我有用。

当我有这样的数据框时:

raw_data = {'column1': [42,13, np.nan, np.nan],
        'column2': [4,12, np.nan, np.nan],
        'column3': [25,61, np.nan, np.nan]}

看起来像这样:

   column1  column2  column3
0     42.0      4.0     25.0
1     13.0     12.0     61.0
2      NaN      NaN      NaN
3      NaN      NaN      NaN

我可以打印各列的总和,其中 axis=0。还有这个:

df = pd.DataFrame(raw_data )
print(df.sum(axis=0))

给出输出:

column1    55.0
column2    16.0
column3    86.0

当我尝试从 axis=0 的数据框中删除值时,这应该再次与列*有关。但当我这样做时:

dfclear=df.dropna(axis=0,how='all')
print(dfclear)

我得到输出:

column1  column2  column3
0     42.0      4.0     25.0
1     13.0     12.0     61.0

我期望得到以下结果(我在 axis=1 时得到):

   column1  column2  column3
0     42.0      4.0     25.0
1     13.0     12.0     61.0
2      NaN      NaN      NaN
3      NaN      NaN      NaN

所以在我看来, axis 在 sum() 和 dropna() 之间的行为不同

我在这里缺少什么吗?

*https://pandas.pydata.org/pandas-docs/stable/ generated/pandas.DataFrame.dropna.html

python pandas dataframe sum
4个回答
2
投票

来自文档字符串:

In [41]: df.dropna?
Signature: df.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
Docstring:
Return object with labels on given axis omitted where alternately any
or all of the data are missing

Parameters
----------
axis : {0 or 'index', 1 or 'columns'}, or tuple/list thereof
    Pass tuple or list to drop on multiple axes
...

如果您不确定什么是轴,请使用以下方法:

In [39]: df.dropna(axis='index', how='all')
Out[39]:
   column1  column2  column3
0     42.0      4.0     25.0
1     13.0     12.0     61.0

In [40]: df.dropna(axis='columns', how='all')
Out[40]:
   column1  column2  column3
0     42.0      4.0     25.0
1     13.0     12.0     61.0
2      NaN      NaN      NaN
3      NaN      NaN      NaN

0
投票

我认为答案是正确的:

print(df)

产生以下输出:

   column1  column2  column3
0     42.0      4.0     25.0
1     13.0     12.0     61.0
2      NaN      NaN      NaN
3      NaN      NaN      NaN

dfclear=df.dropna(axis=0,how='all')
print(dfclear)

产生以下输出:

   column1  column2  column3
0     42.0      4.0     25.0
1     13.0     12.0     61.0

来自 Pandas 文档示例说明:

删除所有元素均为 nan 的行(没有要删除的行) 下降,所以 df 保持不变)


0
投票

请注意,pandas shift 也有反直觉的轴含义,其中 0 表示原始,1 表示列。

我想他们需要在文档中的某个地方解决这些问题和其他类似的问题


0
投票

pandas.DataFrame.sum
遵循
numpy
约定。在
numpy.ndarray
中,
axis
表示数据被压缩的方向。它适用于任意数量的维度。请参考这个答案。

但是

pandas.Dataframe
只能是2D的。并且
pandas
在实现
axis
函数时失去了
pandas.Dataframe.dropna
约定。这是一种无法解释的不一致。参考这个答案

© www.soinside.com 2019 - 2024. All rights reserved.