从具有重复自定义索引的数据框中删除行,并保留具有一列最大值的行。

3

我有数千个Pandas数据框df,每个数据框都有1.2亿行,长这样:

     a   b     c    d    e
111  10  100   200  300  james
112  11  110   210  310  june
112  11  140   210  312  dune
234  12  120   220  333  dane

重复的索引是自定义索引112。我想保留'b'列的最大值所在的行以及自定义索引'112'。因此输出应如下所示:
      a   b     c    d    e
111  10  100   200  300  james
112  11  140   210  312  dune
234  12  120   220  333  dane

这该怎么以高效的方式来完成,既能节省内存又能提高速度?

那么你的索引也是数据框中的一列吗? - user16836078
是的,它对应另一列。 - stackie
两个答案都适用。对于@DataCruncher的答案,只需执行df.set_index('1st Column', inplace=True)即可按照该答案进行操作。对于@L'Artiste的答案,您不需要执行reset_index,只需执行df.groupby('1st Column').max()即可。因此,您可以将您喜欢的答案标记为正确 :) - user16836078
是的,在上面的例子中,我已经将其移动到索引。我尝试过,但两者都似乎很慢。它们在较小的数据中运行良好。 - stackie
也许你需要 dask 包来处理非常大的数据。代码将非常相似。请参见 https://docs.dask.org/en/latest/dataframe.html - user16836078
2个回答

3
您可以尝试以下方法。
dupe_idx_rows = df[df.index.duplicated(keep=False)].sort_values(by='b', ascending=False)

dupe_idx_rows_one = dupe_idx_rows[~dupe_idx_rows.index.duplicated(keep='first')]

out= pd.concat([df[~df.index.duplicated(keep=False)],dupe_idx_rows_one])

或者,您也可以尝试使用Groupby。


抱歉,我已经编辑了问题。实际上,索引是我感兴趣的一列,所以我必须保持它不变。 - stackie
由于某种原因,这似乎很慢。 - stackie

1

您可以使用pandas.DataFrame.max按组过滤每个列的最大值:

out = df.reset_index().groupby('index').max('b')

>>> 打印(out)

输入图像描述


谢谢!对不起,我已经编辑了问题。索引实际上是我感兴趣的一列,所以我必须保持它原样。 - stackie
我更新了我的答案。请查看! - Timeless
b 传递到 max 函数中会做什么? - rhug123
1
@stackie 在整个数据框上进行分组可能会很慢,具体取决于数据框的大小。请参见我下面给出的答案。 - DataCruncher
Groupby 最终会在输出中删除列“e”。 - stackie

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