在计算 Pandas 创建的数据框中的列的平均值时指定“跳过 NA”
Posted
技术标签:
【中文标题】在计算 Pandas 创建的数据框中的列的平均值时指定“跳过 NA”【英文标题】:specifying "skip NA" when calculating mean of the column in a data frame created by Pandas 【发布时间】: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
需要跳过?
【问题讨论】:
【参考方案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找到。
【讨论】:
@lokheart,这可能会让你感兴趣。 为什么 np.mean 不起作用?以上是关于在计算 Pandas 创建的数据框中的列的平均值时指定“跳过 NA”的主要内容,如果未能解决你的问题,请参考以下文章
如何将 numpy 数组存储在 Pandas 数据框的列中?
如何从 pandas 数据框中的大型每日 JSON 数据集计算平均月值?