2017-06-20 70 views
1

比方說,我有以下系列。熊貓掉落非常重複只有

s = pandas.Series([0, 1, 2, 3, 3, 3, 3, 4, 5, 6, 6, 6, 7, 7]) 

我可以保持該系列的第一個重複(每個重複值)以下

s[s.duplicated(keep='first')] 

我可以保持該系列的最後一個副本(每個副本值)以下

s[s.duplicated(keep='last')] 

但是,我正在執行以下操作。

  1. 只刪除第一個副本,保留該匹配值的其他副本,但也保留所有其他重複值不同的值(包括每個組的第一個副本)。在上面的例子中,我們將丟棄第一個3,但保留其他3's。保留所有其他重複項。
  2. 保留第一個副本,丟棄匹配值的副本,但也保留其他變量值的所有其他副本。在上面的例子中,我們保留第一個3,但是放棄所有其他3's。保留所有其他重複項。

我一直在使用cumsum()diff()拍攝我的大腦,以便在檢測到重複項時捕獲更改。我想象一個解決方案會涉及到這一點,但我似乎無法得到一個完美的解決方案。我現在經歷了太多的真值表...

回答

3
ind = s[s.duplicated()].index[0] 

給你第一個索引,其中記錄是重複的。用它來放下。

In [45]: s.drop(ind) 
Out[45]: 
0  0 
1  1 
2  2 
4  3 
5  3 
6  3 
7  4 
8  5 
9  6 
10 6 
11 6 
12 7 
13 7 
dtype: int64 

對於部分2,必須有一個整潔的解決方案,但我唯一能想到的是使用創建一系列布爾變量來表示,其中指數不等於IND和指數值不等於IND值,然後使用np.logical_xor:

s[np.logical_xor(s.index != ind, s==s.iloc[ind])] 

Out[95]: 
0  0 
1  1 
2  2 
4  3 
7  4 
8  5 
9  6 
10 6 
11 6 
12 7 
13 7 
dtype: int64 
+0

你知道的一種方式,我的問題得到#2 ?即使給了#1的答案,我仍然遇到問題。 – jab

+0

我用解決方案更新了答案 –

2
  • duplicated第一個
  • duplicated(keep=False)後得到的DUP讓所有的DUP,包括第一個
  • xor^找到它只是第一DUP
  • 注:這將使第一個6以及

s[~(s.duplicated(keep=False)^s.duplicated())] 

0  0 
1  1 
2  2 
4  3 
5  3 
6  3 
7  4 
8  5 
10 6 
11 6 
13 7 
dtype: int64