【问题标题】:specifying "skip NA" when calculating mean of the column in a data frame created by Pandas在计算 Pandas 创建的数据框中的列的平均值时指定“跳过 NA”
【发布时间】:2014-09-22 05:49:41
【问题描述】:

我正在通过复制一些 R 小插曲的郊游来学习 Pandas 包。现在我以 R 中的 dplyr 包为例:

http://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html

R 脚本

planes <- group_by(hflights_df, TailNum)
delay <- summarise(planes,
  count = n(),
  dist = mean(Distance, na.rm = TRUE))
delay <- filter(delay, count > 20, dist < 2000)

Python 脚本

planes = hflights.groupby('TailNum')
planes['Distance'].agg({'count' : 'count',
                        'dist' : 'mean'})

如何在 python 中明确声明 NA 需要跳过?

【问题讨论】:

    标签: python r pandas na


    【解决方案1】:

    这是一个棘手的问题,因为你不会这样做。 Pandas 会自动从聚合函数中排除 NaN 数字。考虑一下我的df

        b   c   d  e
    a               
    2   2   6   1  3
    2   4   8 NaN  7
    2   4   4   6  3
    3   5 NaN   2  6
    4 NaN NaN   4  1
    5   6   2   1  8
    7   3   2   4  7
    9   6   1 NaN  1
    9 NaN NaN   9  3
    9   3   4   6  1
    

    内部count() 函数将忽略NaN 值,mean() 也将忽略。我们获得NaN 的唯一点是唯一的值是NaN。然后,我们取一个空集的平均值,结果是NaN

    In[335]: df.groupby('a').mean()
    Out[333]: 
              b    c    d         e
    a                              
    2  3.333333  6.0  3.5  4.333333
    3  5.000000  NaN  2.0  6.000000
    4       NaN  NaN  4.0  1.000000
    5  6.000000  2.0  1.0  8.000000
    7  3.000000  2.0  4.0  7.000000
    9  4.500000  2.5  7.5  1.666667
    

    聚合函数的工作方式相同:

    In[340]: df.groupby('a')['b'].agg({'foo': np.mean})
    Out[338]: 
            foo
    a          
    2  3.333333
    3  5.000000
    4       NaN
    5  6.000000
    7  3.000000
    9  4.500000
    

    附录:注意标准dataframe.mean API 将如何允许您控制NaN 值的包含,其中默认为排除

    【讨论】:

    • 谢谢,我该如何做相反的事情:让pandas 包含NaN
    • @Dr_Zaszuś 看看最后一行,它链接到手册。它列出了包括NaN 的选项。正如其他答案所建议的那样,您可以在此基础上进行构建。
    【解决方案2】:

    foobar 所说的关于它的默认实现方式是正确的,但是有一种非常简单的方法可以指定skipna。这是一个不言自明的例子:

    def custom_mean(df):
        return df.mean(skipna=False)
    
    group.agg({"your_col_name_to_be_aggregated":custom_mean})
    

    就是这样!你可以按照你想要的方式自定义你自己的聚合,我希望这会相当有效,但我没有深入研究它。

    还讨论了here,但我想我会帮助传播这个好消息! 答案在官方doc找到。

    【讨论】:

    • @lok​​heart,这可能会让你感兴趣。
    • 为什么 np.mean 不起作用?
    猜你喜欢
    • 2021-04-16
    • 1970-01-01
    • 2015-03-26
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 2016-03-03
    相关资源
    最近更新 更多