2

我有一个由 item_id 索引的 pandas 数据框,每个项目的行数不同(即 item_id X 可能有 10 行,而项目 Y 可能只有 1 行)。我想要做的是从数据框中删除与那些只有一行的 item_ids 相对应的所有行(即删除只有一个观察值的所有项目)。因此,如果数据框的样本如下所示:

item_id measure1    measure2 ...
1       someNumber  someNumber
1       someNumber  someNumber
1       someNumber  someNumber
2       someNumber  someNumber
3       someNumber  someNumber
3       someNumber  someNumber
4       someNumber  someNumber
5       someNumber  someNumber
5       someNumber  someNumber

新的数据框应如下所示:

item_id measure1    measure2   ...
1       someNumber  someNumber 
1       someNumber  someNumber
1       someNumber  someNumber
3       someNumber  someNumber
3       someNumber  someNumber
5       someNumber  someNumber
5       someNumber  someNumber

也就是说,我想删除只有一个观察值的项目的所有数据(在本例中为 item_ids 2 和 4)。

4

1 回答 1

3

你可以使用groupbyand filter

>>> df.groupby("item_id").filter(lambda x: len(x) > 1)
   item_id    measure1    measure2
0        1  someNumber  someNumber
1        1  someNumber  someNumber
2        1  someNumber  someNumber
4        3  someNumber  someNumber
5        3  someNumber  someNumber
7        5  someNumber  someNumber
8        5  someNumber  someNumber

事实上,这与docs中的示例之一非常相似。


请注意,在评论中进行了一些讨论之后,很明显在某些情况下,这似乎在 0.12 中不起作用,但在当前主干中起作用。我相信这是由 jreback 在此提交中修复的,如果我正在阅读过滤器结果类型的右分支,从而避免了困难。

于 2013-10-22T02:38:21.543 回答