Итак, у меня есть эта серия целых чисел, показанных ниже

from pandas import Series
s = Series([1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])

И я хочу посмотреть, сколько раз числа меняются в серии, поэтому я могу сделать следующее и получить ожидаемый результат.

[i != s[:-1][idx] for idx, i in enumerate(s[1:])]
Out[5]: 
[True,
 True,
 True,
 True,
 True,
 True,
 True,
 True,
 True,
 True,
 True,
 True,
 True,
 True,
 True,
 True,
 True,
 True,
 True,
 True,
 True,
 True,
 True,
 True,
 True,
 True,
 True,
 True,
 True,
 True,
 False,
 False,
 False,
 False,
 False,
 False,
 False,
 False,
 False]

Отсюда я могу просто посчитать количество присутствующих Истины. Но это, очевидно, не лучший способ работать на серии Pandas, и я добавляю это в ситуации, когда производительность имеет значение, поэтому я сделал следующее, ожидая идентичных результатов, однако я был очень удивлен и смущен.

s[1:].ne(s[:-1])
Out[4]: 
0      True
1     False
2     False
3     False
4     False
5     False
6     False
7     False
8     False
9     False
10    False
11    False
12    False
13    False
14    False
15    False
16    False
17    False
18    False
19    False
20    False
21    False
22    False
23    False
24    False
25    False
26    False
27    False
28    False
29    False
30    False
31    False
32    False
33    False
34    False
35    False
36    False
37    False
38    False
39     True
dtype: bool

Мало того, что вывод с использованием метода Series.ne не имеет никакого логического смысла для меня, но вывод также более длинный, чем любой из вводов, что особенно запутанно.

Я думаю, что это может быть связано с этим https://github.com/pandas-dev/ панды / вопросы / 1134

Независимо от того, мне любопытно, что я делаю неправильно и каков будет лучший способ добиться этого.

< Сильный > ТЛ ; др :

Где s - это панда. Серия int

[i != s[:-1][idx] for idx, i in enumerate(s[1:])] != s[:-1].ne(s[1:]).tolist()

< Сильный > Edit Спасибо всем, читая некоторые ответы ниже возможного решения sum(s.diff().astype(bool)) - 1, однако мне все еще любопытно, почему вышеупомянутое решение не работает

1
Hunter Jackson 22 Фев 2018 в 22:45

3 ответа

Лучший ответ

Вы можете использовать diff

s.diff().ne(0)
1
piRSquared 22 Фев 2018 в 19:49

IIUC, используя shift

s!=s.shift()
1
YOBEN_S 22 Фев 2018 в 19:48