簡體   English   中英

python pandas - 刪除列中的重復項並根據復雜的標准保留行

[英]python pandas - remove duplicates in a column and keep rows according to a complex criteria

假設我有這個 DF:

s1 = pd.Series([1,1,2,2,2,3,3,3,4])
s2 = pd.Series([10,20,10,5,10,7,7,3,10])
s3 = pd.Series([0,0,0,0,1,1,0,2,0])
df = pd.DataFrame([s1,s2,s3]).transpose()
df.columns = ['id','qual','nm']
df
   id  qual  nm
0   1    10   0
1   1    20   0
2   2    10   0
3   2     5   0
4   2    10   1
5   3     7   1
6   3     7   0
7   3     3   2
8   4    10   0

我想獲得一個沒有重復 ID 的新 DF,因此應該有 4 行,ID 為 1、2、3、4。 應保留的行應根據以下標准選擇:取最小nm 的那一行,如果相等,取最大qual 的那一行,如果仍然相等,則只選擇一個。 我想我的代碼應該是這樣的:

df.groupby('id').apply(lambda x: ???)

它應該返回:

   id  qual  nm
0   1    20   0
1   2    10   0
2   3     7   0
3   4    10   0

但不確定我的函數應該接受和返回什么。
或者可能有更簡單的方法?
謝謝!

boolean indexingGroupBy.transform用於每組的GroupBy.transform行數,然后對於最大值和最后,如果仍然DataFrame.drop_duplicates ,則通過DataFrame.drop_duplicates刪除它們:

#get minimal nm
df1 = df[df['nm'] == df.groupby('id')['nm'].transform('min')]
#get maximal qual    
df1 = df1[df1['qual'] == df1.groupby('id')['qual'].transform('max')]
#if still dupes get first id
df1 = df1.drop_duplicates('id')
print (df1)
   id  qual  nm
1   1    20   0
2   2    10   0
6   3     7   0
8   4    10   0

用 -

grouper = df.groupby(['id'])
df.loc[(grouper['nm'].transform(min) == df['nm'] ) & (grouper['qual'].transform(max) == df['qual']),:].drop_duplicates(subset=['id'])

輸出

   id  qual  nm
1   1    20   0
2   2    10   0
6   3     7   0
8   4    10   0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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