2017-06-20 39 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