Как найти дубликаты в панде - PullRequest
0 голосов
/ 12 июня 2018

Редактирование.

Предположим, у меня есть следующие серии в пандах:

>>>p
0     0.0
1     0.0
2     0.0
3     0.3
4     0.3
5     0.3
6     0.3
7     0.3
8     1.0
9     1.0
10    1.0
11    0.2
12    0.2
13    0.3
14    0.3
15    0.3

Мне нужно идентифицировать каждую последовательность последовательных дубликатов - ее первый и последний индекс.Используя приведенный выше пример, мне нужно идентифицировать первую последовательность из 0,3 (от индекса 3 до 7) независимо от последней последовательности из 0,3 (от индекса 13 до 15).

Использование Series.duplicated недостаточно, потому что:

* использование keep = 'first' помечает все первые экземпляры дубликатов False, но оставляет индекс 13 как True, поскольку это не первое появление 0.3.

* То же самое касается keep = 'last'

* keep = False, просто помечает все записи как True.

Спасибо!

1 Ответ

0 голосов
/ 13 июня 2018

Мне кажется, нужен трюк со сравнением shift ed значений для не равных ne с cumsum и последним drop_duplicates:

s = df['a'].ne(df['a'].shift()).cumsum()
a = s.drop_duplicates().index
b = s.drop_duplicates(keep='last').index

df = pd.DataFrame({'first':a, 'last':b})
print (df)
   first  last
0      0     2
1      3     7
2      8    10
3     11    12
4     13    15

Если хотите также дублировать значение в новый столбец, то решение по изменению бита с duplicated:

s = df['a'].ne(df['a'].shift()).cumsum()
a = df.loc[~s.duplicated(), 'a']
b = s.drop_duplicates(keep='last')

df = pd.DataFrame({'first':a.index, 'last':b.index, 'val':a})
print (df)
    first  last  val
0       0     2  0.0
3       3     7  0.3
8       8    10  1.0
11     11    12  0.2
13     13    15  0.3

Еслинужен новый столбец:

df['count'] = df['a'].ne(df['a'].shift()).cumsum()
print (df)
      a  count
0   0.0      1
1   0.0      1
2   0.0      1
3   0.3      2
4   0.3      2
5   0.3      2
6   0.3      2
7   0.3      2
8   1.0      3
9   1.0      3
10  1.0      3
11  0.2      4
12  0.2      4
13  0.3      5
14  0.3      5
15  0.3      5
...