Pandas按分类列进行分组后返回NaN

5

在pandas数据帧中没有NaN,在每个groupby的组中,它们只有Int64Index,没有其他非groupby列。我感到困惑。

我错过了什么?

这里是可复制的代码:

df = pd.DataFrame({
    "a": np.random.rand(1000),
    "b": np.random.rand(1000),
    "c": np.random.rand(1000)
})

ranges = np.linspace(0, 1, 100)
df["a_bin"] = pd.cut(df.a, ranges)
df["b_bin"] = pd.cut(df.b, ranges)

print(df.groupby(["a_bin", "b_bin"]).c.mean())

这里是结果:

a_bin          b_bin           
(0.0, 0.0101]  (0.0, 0.0101]      NaN
               (0.0101, 0.0202]   NaN
               (0.0202, 0.0303]   NaN
               (0.0303, 0.0404]   NaN
               (0.0404, 0.0505]   NaN
                                   ..
(0.99, 1.0]    (0.949, 0.96]      NaN
               (0.96, 0.97]       NaN
               (0.97, 0.98]       NaN
               (0.98, 0.99]       NaN
               (0.99, 1.0]        NaN
Name: c, Length: 9801, dtype: float64

我的 pandas 版本是:1.0.1。
2个回答

5

有各种可能的类别组合,未使用的类别会创建缺失值,请查看此链接

因此,如果需要删除缺失值:

print(df.groupby(["a_bin", "b_bin"]).c.mean().dropna())
a_bin          b_bin           
(0.0, 0.0101]  (0.0, 0.0101]       0.381681
               (0.0505, 0.0606]    0.148762
               (0.0909, 0.101]     0.313093
               (0.101, 0.111]      0.488104
               (0.313, 0.323]      0.518599

(0.99, 1.0]    (0.505, 0.515]      0.149027
               (0.576, 0.586]      0.099652
               (0.778, 0.788]      0.220360
               (0.828, 0.838]      0.166424
               (0.97, 0.98]        0.516558
Name: c, Length: 948, dtype: float64

1
是的,有很多未使用的类别,您可以使用df.groupby(['a_bin','b_bin']).c.count()检查每个组的计数。好答案。+1 - Ch3steR
1
哇,太棒了。一般来说,我猜是列的“分类”性质导致所有这些不存在的组被创建。在普通的groupby中,只有作为键的一部分的项才会得到一个值。感谢您帮助我保持理智:) +1 - user1780424

5
作为前一个答案所建议的,您可以简单地在结果上使用dropna()。然而,如果您有许多未使用的类别,则中间计算将会产生大量NaN值(尤其是在使用多个索引时),这可能会破坏您的性能。相反,在调用groupby时,您应该将参数“observed”设置为True,这将防止生成nan值。
print(df.groupby(["a_bin", "b_bin"], observed = True).c.mean())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接