问题描述
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()