2014-11-04 54 views
2

我有這樣一個數據幀:大熊貓降一列的副本與標準

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的重複,我想保持有任何樣的名字在它的行(!= none,基本上)在列B中,但是如果所有重複項中唯一的值是none,我仍然想保留它(如239616417)。

應該減少到:

A B 
239616412 none 
239616414 name2 
239616417 none 
239616418 name1 
239616428 name1 
239616429 name1 
+0

如果有'B'多個非沒有名字,你會想保留重複? – chrisb 2014-11-04 21:13:35

+0

我寧願保留它們,但如果代碼更容易這樣做,它們也可以被刪除。這些非重複的只有5個左右,所以我可以管理它們。 – user3264659 2014-11-04 22:00:18

回答

0

如果你想刪除任何重複,這應該工作。該排序會在NAs之後放置所有有效的條目,因此它們將優先於drop_duplicate邏輯。

df.loc[df['B'] == 'none', 'B'] = np.nan 
df = df.sort(['A','B']).drop_duplicates(subset='A') 

如果您想保留重複有效的值,你可以做這樣的事情,這將數據分成空/非空,和重組。

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]) 
4

這是一個解決方案。

首先排序列上的 '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 

然後,刪除重複w.r.t.列「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 
+0

看起來第一個應該是'df.sort_values'和最後一個'df.sort_index'。 – Teepeemm 2018-01-26 16:05:00