簡體   English   中英

熊貓使用條件刪除一列的重復項

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

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