【问题标题】:Pandas Groupby with Categorical Columns returns NaN带有分类列的 Pandas Groupby 返回 NaN
【发布时间】:2020-08-31 20:39:53
【问题描述】:

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

我的熊猫版本是:1.0.1

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      有所有可能的类别组合,未使用的类别会产生缺失值,请查看this

      所以如果需要删除缺失值:

      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
      

      【讨论】:

      • 是的,有很多未使用的类别,您可以使用df.groupby(['a_bin','b_bin']).c.count() 检查每个组的计数。不错的答案。 +1
      • 哇,太棒了。一般来说,我猜是列的“分类”性质导致创建所有这些不存在的组。在普通的 groupby 中,只有作为键的一部分的项目才会得到一个值。感谢您帮助我保持理智 :) +1
      猜你喜欢
      • 2018-07-06
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      相关资源
      最近更新 更多