忽略熊猫 groupby 组中的 NaN 的标准错误

Posted

技术标签:

【中文标题】忽略熊猫 groupby 组中的 NaN 的标准错误【英文标题】:Standard error ignoring NaN in pandas groupby groups 【发布时间】:2013-08-05 02:00:15 【问题描述】:

我已将数据加载到具有列标题多索引的数据框中。目前我一直在按列索引对数据进行分组,以获取组的平均值并计算 95% 置信区间,如下所示:

from pandas import *
import pandas as pd
from scipy import stats as st

#Normalize to starting point then convert
normalized = (data - data.ix[0]) * 11.11111
#Group normalized data based on slope and orientation
grouped = normalized.groupby(level=['SLOPE','DEPTH'], axis=1)
#Obtain mean of each group
means = grouped.mean()
#Calculate 95% confidence interval for each group
ci = grouped.aggregate(lambda x: st.sem(x) * 1.96)

但是这样做的问题是,用于组的 mean 函数会忽略 NaN 值,而 scipy 函数 st.sem 如果组中有 NaN 则返回 NaN。我需要计算标准误差,同时像 mean 函数一样忽略 NaN。

我尝试过这样计算 95% 的置信区间:

#Calculate 95% confidence interval for each group
ci = grouped.aggregate(lambda x: np.std(x) / ??? * 1.96)

numpy 中的 std 会给我忽略 NaN 值的标准偏差,但我需要将其除以忽略 NaN 的组大小的平方根才能得到标准误差。

在忽略 NaN 的情况下计算标准误差的最简单方法是什么?

【问题讨论】:

尝试在你的groupby()函数中包含这个:normalized.groupby(by=[col_name_with_NaN],level=['SLOPE','DEPTH'], axis=1),这样NaN的值就不会出现在grouped 有 36 列,任何给定的行都可能有 NaN。缺失数据。您是否建议传递所有列名的列表? by= [ ] 参数有什么作用?我一直在环顾四周,但似乎无法弄清楚这一点。 是的,尝试将所有 36 列名传递给 by 参数。我不完全了解这个参数的作用,但它过滤了 NaN... 我通过 list(data.columns) 得到一个类型错误:TypeError: 'numpy.ndarray' object is not callable。就像我说的那样,它是一个多行索引,所以我可能不得不将它转换为列表列表(不知道该怎么做) 【参考方案1】:

Series 对象的count() 方法将不返回 NaN 值计数:

import pandas as pd
s = pd.Series([1,2,np.nan, 3])
print s.count()

输出:

3

那么,试试吧:

ci = grouped.aggregate(lambda x: np.std(x) / x.count() * 1.96)

【讨论】:

grouped.aggregate(lambda x: np.std(x, ddof=1)/np.sqrt(x.count()))

以上是关于忽略熊猫 groupby 组中的 NaN 的标准错误的主要内容,如果未能解决你的问题,请参考以下文章

pandas使用groupby.first函数groupby.nth函数获取每个组中的第一个值实战:groupby.first函数和groupby.nth函数对比(对待NaN的差异)

熊猫如何使用 groupby 将 NaN 值替换为平均值 [重复]

熊猫:在每组中按平均值填充缺失值

熊猫:在每组中按平均值填充缺失值

使用更奇怪的结果:熊猫中的 groupby 和 nlargest()

Pandas - 列中 groupby 之后的 Concat 字符串,忽略 NaN,忽略重复项