[英]Drop duplicates but keep max value and keep first row where max value is 0 if there is no max value
我有一個看起來像這樣的 dataframe
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 補償的索引中列出第一個人。 有時會,有時不會。 我找不到這種情況的模式或原因。 我意識到這個問題似乎沒有在我的示例 dataframe 中重現
解決方案中的一個潛在限制是我的 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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.