熊猫掉落非常先复制

时间:2017-06-20 18:13:54

标签: python pandas

假设我有以下系列。

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。保留所有其他剩余的重复项。
  3. 我一直在使用cumsum()diff()进行大脑搜索,以便在检测到重复时捕获更改。我想解决方案会涉及到这一点,但我似乎无法获得完美的解决方案。我现在经历了太多的真值表...

2 个答案:

答案 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