在计算由Pandas创建的数据帧中的列的平均值时指定"跳过NA"

lok*_*art 8 python r pandas na

我正在Pandas通过复制一些R小插曲的郊游来学习包装.现在我使用dplyrR中的包作为示例:

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)
Run Code Online (Sandbox Code Playgroud)

Python脚本

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

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

Foo*_*Bar 9

这是一个棘手的问题,因为你不这样做.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
Run Code Online (Sandbox Code Playgroud)

内部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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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


c-a*_*c-a 6

foob​​ar 所说的关于它的默认实现方式是正确的,但是有一个非常简单的方法来指定skina。这是一个不言而喻的例子:

def custom_mean(df):
    return df.mean(skipna=False)

group.agg({"your_col_name_to_be_aggregated":custom_mean})
Run Code Online (Sandbox Code Playgroud)

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

这里也讨论过这个问题,但我想我应该帮助传播这个好消息!在官方文档中找到了答案。