带有分类列的 Pandas Groupby 返回 NaN

use*_*424 5 python pandas pandas-groupby

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

这是结果:

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

我的熊猫版本是:1.0.1

jez*_*ael 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
Run Code Online (Sandbox Code Playgroud)


小智 5

正如前面的答案所建议的,您可以简单地对结果使用 dropna() 。但是,如果您有许多未使用的类别,则中间计算将具有大量的 nan 值(特别是在使用多个索引时),这可能会破坏您的性能。

相反,在调用groupby时,您应该将参数“observed”设置为 True,这将阻止生成 nan 值。

print(df.groupby(["a_bin", "b_bin"], observed = True).c.mean())
Run Code Online (Sandbox Code Playgroud)