删除重复项但保留最大值,如果没有最大值,则保留最大值为 0 的第一行

Drop duplicates but keep max value and keep first row where max value is 0 if there is no max value

我有一个看起来像这样的数据框

df = pd.DataFrame({'Index': ['0', '0', '1', '1', '2', '2', '2'], 'Title': ["CEO", "VP", "CEO", "VP", "Exec Director", "Director", "Manager"], 'Compensation': ['125000', '100000', '0', '0','0','0','0'] })

我的目标是根据索引删除重复值,并使最大值保持在该索引号的补偿之下。但是,有些指数的所有薪酬值为 0。在这种情况下,我只想保留第一个列出的人,因为通常是 CEO。

我尝试了以下解决方案:

df2 = df.groupby('Index', as_index=False).max('Compensation')

这对我不起作用,因为对于补偿为 0 的索引分组,似乎选择最后一个而不是第一个

我也试过:

df2 = df.sort_values('Compensation', ascending=False).drop_duplicates('Index', keep='first').sort_index()

这对我不起作用,因为它并不总是在整个组报告 0 补偿的索引中排在第一位。有时会,有时不会。我找不到这种情况的模式或原因。我意识到这个问题似乎并没有在我的示例数据框中复制

解决方案中的一个潜在限制是我的 DF 大约有 2000 万行,而生成的 DF2 应该大约有 160 万行。上面的代码成功地实现了那么多,但同样,问题是如何拉取 0 补偿索引组。

我理解文档指出应该采取第一个遇到的问题,但事实并非如此,因为我已经检查了使用上述代码前后的数据。

关于如何进行的任何想法?

所以让我们试试idxmax

#df.Compensation=df.Compensation.astype(int)
out = df.loc[df.groupby('Index')['Compensation'].idxmax()]
Out[321]: 
  Index Title  Compensation
0     0   CEO        125000
2     1   CEO             0

这里更新的原因是sort_values默认是quicksort,我们应该改成mergesort

df2 = df.sort_values('Compensation', ascending=False).drop_duplicates('Index', keep='first',kind = 'mergesort').sort_index()