【问题标题】:How to compute mean() for particular column in Pandas DataFrame without considering NaN values如何在不考虑 NaN 值的情况下计算 Pandas DataFrame 中特定列的均值()
【发布时间】:2016-09-02 10:54:25
【问题描述】:

据我了解,axis=0 垂直向下跨行,axis =1 水平跨列 例如:

In [55]: df1
    Out[55]:
       x  y  z
    0  1  3  8
    1  2  4  NaN
    2  3  5  7
    3  4  6  NaN
    4  5  7  6
    5 NaN 1  9
    6 NaN 9  5

所以 df.mean(axis=0) 列的平均值给出:

    x  3
    y  5
    z  7

但如果我想按列删除缺失值

   y
0  3
1  4
2  5
3  6
4  7
5  1
6  9

然后我必须使用 df.dropna(axis=1) 而不是 df.dropna(axis=0) 来获得我想要的输出,但对于行来说,axis=1 不是,这意味着列案例?

【问题讨论】:

  • 你的标题误导了。这是熊猫特有的。

标签: python pandas dataframe


【解决方案1】:

来自熊猫文档:

DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
"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

所以函数的定义方式是axis=1 表示列。 如果你想逐行删除,你可以这样称呼它:

df_dropped = df.dropna(how='all') # drop by row

【讨论】:

  • 但这不是矛盾的吗? axis=1 表示在大多数情况下为行,但在某些情况下为列?
  • 乍一看我会说是的,这是不一致的。但也许这个功能的设计背后还有其他一些想法……我和熊猫合作的时间不多。所以我觉得没有资格说这样的话
【解决方案2】:

dropna()标签 放在给定轴上,因此 df.dropna(axis=1) 的意思是“查看轴 1 上的标签(即 x、y 和 z),如果有任何标签,则删除该标签该列中的 NaN"

【讨论】:

    【解决方案3】:

    这是您可以在不丢弃 NaN 的情况下计算均值但仍不考虑均值的方法。

    1.艰难的路

    val = df['y']
    val[~val.isnull()].mean()
    

    2。简单的方法

    df['y'].mean()
    

    DataFrame.mean() 函数从计算中隐式排除“NaN”值。你不需要明确地处理它。它使用参数skipna 这样做,其默认值为skina=True

    如果您明确希望考虑全长列,无论是否存在 NaN 值,您都可以使用 set skipna=False,如下所示:

    df['y'].mean(skipna=False)
    

    参考官方文档总是一个好习惯。 Refer docs for DataFrame.mean() here

    干杯!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-01
      • 2016-10-24
      • 2014-12-03
      • 2016-04-04
      • 2022-01-07
      • 1970-01-01
      相关资源
      最近更新 更多