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
类别有所有可能的组合,未使用的类别会创建缺失值,请检查此。
因此,如果需要删除缺失值:
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)
| 归档时间: |
|
| 查看次数: |
1786 次 |
| 最近记录: |