Pandas在groupby过程中返回空分组

9
我有一个Pandas DataFrame,其中包含3列:targetpredconf_bin。如果我运行groupby(by='conf_bin').apply(...),则我的应用函数将对在conf_bin列中不存在的值调用空的DataFrame。这是怎么可能的?

细节

DataFrame看起来像这样:

        target  pred conf_bin
0            5     6     0.50
1            4     4     0.60
2            4     4     0.50
3            4     3     0.50
4            4     5     0.50
5            5     5     0.55
6            5     5     0.55
7            5     5     0.55

很明显,conf_bin是一个数值二进制,在np.arange(0, 1, 0.05)的范围内取值。然而,并非所有值都出现在数据中:
In [224]: grp = tp.groupby(by='conf_bin')

In [225]: grp.groups.keys()
Out[225]: dict_keys([0.5, 0.60000000000000009, 0.35000000000000003, 0.75, 0.85000000000000009, 0.65000000000000002, 0.55000000000000004, 0.80000000000000004, 0.20000000000000001, 0.45000000000000001, 0.40000000000000002, 0.30000000000000004, 0.70000000000000007, 0.25])

因此,例如值00.05不会出现。但是,当我在组上运行apply时,我的函数确实会为这些值调用:
In [226]: grp.apply(lambda x: x.shape)
Out[226]:
conf_bin
0.00        (0, 3)
0.05        (0, 3)
0.10        (0, 3)
0.15        (0, 3)
0.20       (22, 3)
0.25       (75, 3)
0.30       (95, 3)
0.35      (870, 3)
0.40     (8505, 3)
0.45    (40068, 3)
0.50    (51238, 3)
0.55    (54305, 3)
0.60    (47191, 3)
0.65    (38977, 3)
0.70    (34444, 3)
0.75    (20435, 3)
0.80     (3352, 3)
0.85        (4, 3)
0.90        (0, 3)
dtype: object

问题:

  1. Pandas怎么知道0.0和0.5这些值“有意义”,因为它们并没有出现在我的DataFrame中?
  2. 为什么它会使用空的DataFrame对象调用我的apply函数,对于那些在grp.groups中不存在的值?

您能提供一个自包含的示例,并附带演示问题的样本数据吗? - BrenBarn
9
dtypes是指数据类型。是否可能它们是分类数据类型,并包含有关类别规范中所有桶的信息? - piRSquared
@piRSquared 是正确的。conf_bin 的数据类型是 category。谢谢!! - Oliver Dain
1
请参考 https://dev59.com/6FYM5IYBdhLWcg3wtB3i#50579578 中的分类情况。简而言之,使用 .groupby(..., observed=True) - ayorgo
2个回答

2

我也遇到了这个问题,当我尝试为数据框中的每个类别创建子图时出现了这个问题。

我想到了以下解决方法(基于这篇SO帖子),通过将非空组提取到列表中来实现。

groups = df.groupby('conf_bin')
group_list = [(index, group) for index, group in groups if len(group) > 0]

它确实打破了“你在pandas中处理数据”的隐含约定,可能会导致内存管理不当,但它可以工作。


现在,您可以使用与groupby对象相同的接口迭代您的groupby列表,例如:

fig, axes = plt.subplots(nrows=len(group_list), ncols=1)
for (index, group), ax in zip(group_list, axes.flatten()):
    group['target'].plot(ax=ax, title=index)

0
您的分组列属于分类类型,并包含有关数据中不存在的其他可能分组的信息。

根据目前的写法,你的答案不清楚。请编辑以添加更多细节,帮助其他人理解如何回答问题。你可以在帮助中心找到关于如何撰写好答案的更多信息。 - Community

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