Pandas删除第一个重复项

5

假设我有以下系列。

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。保留所有其他重复项。
  2. 保留第一个重复项,删除匹配值的重复项,但也保留其他不同值的所有重复项。 在上面的示例中,我们将保留第一个3,但删除所有其他3。保留所有其他重复项。
我一直在使用cumsum()diff()来捕获检测到重复项时的变化。我想解决方案会涉及这两个函数,但似乎无法得到完美的解决方案。 我已经通过了太多的真值表......
2个回答

6
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

对于第二部分,必须有一个简洁的解决方案,但我能想到的唯一一个是创建一系列布尔值来指示索引不等于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

你知道如何解决我问题中的#2吗?即使已经得到了#1的答案,我仍然遇到了麻烦。 - jab

4
  • duplicated 用于获取第一个重复项之后的所有重复项
  • duplicated(keep=False) 用于获取包括第一个重复项在内的所有重复项
  • xor^ 用于查找仅为第一个重复项的位置
  • 注意: 这也会删除第一个 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接