删除重复项但保留最大值,如果没有最大值,则保留最大值为 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()
我有一个看起来像这样的数据框
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()