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

问题描述

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

df = pd.DataFrame({'Index': ['0','0','1','2','2'],'Title': ["CEO","VP","CEO","Exec Director","Director","Manager"],'Compensation': ['125000','100000','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()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...