假设我有以下系列。
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')]
但是,我希望做到以下几点。
3
,但保留了另一个3's
。保留所有其他剩余的重复项。3
,但删除所有其他3's
。保留所有其他剩余的重复项。我一直在使用cumsum()
和diff()
进行大脑搜索,以便在检测到重复时捕获更改。我想解决方案会涉及到这一点,但我似乎无法获得完美的解决方案。我现在经历了太多的真值表...
答案 0 :(得分:4)
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部分,必须有一个简洁的解决方案,但我能想到的唯一一个是使用创建一系列bool来指示索引不等于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
答案 1 :(得分:2)
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