簡體   English   中英

如果沒有最大值,則刪除重復項但保留最大值並保留最大值為 0 的第一行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM