![](/img/trans.png)
[英]pandas - drop duplicates in a column, count the number of duplicates and aggregate one column
[英]pandas drop duplicates of one column with criteria
我有一個這樣的數據框:
A B
239616412 none
239616414 name2
239616417 none
239616417 none
239616417 none
239616418 name1
239616418 none
239616428 name1
239616429 none
239616429 none
239616429 name1
我想刪除A列的重復項,並且我想在B列中保留具有任何名稱的行(基本上是=!),但是如果所有重復項中唯一的值是none,我仍然想要保留它(例如239616417
)。
它應減少為:
A B
239616412 none
239616414 name2
239616417 none
239616418 name1
239616428 name1
239616429 name1
這是一個解決方案。
首先對“ B”列進行排序:
df.sort('B', inplace=True)
df
Out[24]:
A B
5 239616418 name1
7 239616428 name1
10 239616429 name1
1 239616414 name2
0 239616412 NaN
2 239616417 NaN
3 239616417 NaN
4 239616417 NaN
6 239616418 NaN
8 239616429 NaN
9 239616429 NaN
然后刪除重復的wrt列“ A”:
df.drop_duplicates('A', inplace=True)
df
Out[26]:
A B
5 239616418 name1
7 239616428 name1
10 239616429 name1
1 239616414 name2
0 239616412 NaN
2 239616417 NaN
您可以對數據框進行重新排序以獲取所需的內容:
df.sort(inplace=True)
df
Out[30]:
A B
0 239616412 NaN
1 239616414 name2
2 239616417 NaN
5 239616418 name1
7 239616428 name1
10 239616429 name1
如果要刪除任何重復項,這應該可以工作。 排序會將所有有效條目放在NA之后,因此它們將在drop_duplicate
邏輯中具有優先drop_duplicate
。
df.loc[df['B'] == 'none', 'B'] = np.nan
df = df.sort(['A','B']).drop_duplicates(subset='A')
如果您想保留重復的有效值,則可以執行類似的操作,將數據拆分為null / not-null,然后重新組合。
valids = df.dropna().drop_duplicates()
invalids = df[pd.isnull(df['B'])].drop_duplicates()
invalids = invalids[~invalids['A'].isin(valids['A'])]
df = pd.concat([valids, invalids])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.