lok*_*art 8 python r pandas na
我正在Pandas通过复制一些R小插曲的郊游来学习包装.现在我使用dplyrR中的包作为示例:
http://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html
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)
planes = hflights.groupby('TailNum')
planes['Distance'].agg({'count' : 'count',
'dist' : 'mean'})
Run Code Online (Sandbox Code Playgroud)
如何在python中明确声明NA需要跳过?
这是一个棘手的问题,因为你不这样做.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值的包含,其中默认值是排除的.
foobar 所说的关于它的默认实现方式是正确的,但是有一个非常简单的方法来指定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)
就是这样!您可以按照自己想要的方式自定义聚合,我希望这会相当有效,但我没有深入研究它。
这里也讨论过这个问题,但我想我应该帮助传播这个好消息!在官方文档中找到了答案。