Оператор `in` не работает должным образом при проверке, содержит ли серия панд заданное значение - PullRequest
1 голос
/ 28 марта 2019

У меня есть следующие серии ZAR, которые содержат метки времени:

In [743]: zar
Out[743]: 
0   2019-01-01
1   2019-03-21
2   2019-04-19
3   2019-04-22
4   2019-04-27
5   2019-05-01
6   2019-06-17
7   2019-08-09
8   2019-09-24
9   2019-12-16
Name: zar, dtype: datetime64[ns]

In [744]: zar[5]
Out[744]: Timestamp('2019-05-01 00:00:00')

In [745]: j
Out[745]: Timestamp('2019-05-01 00:00:00')

In [746]: j in zar.values
Out[746]: False

, поскольку оба содержат метки времени, почему результат ложен? Я хочу вернуть True при сопоставлении временных отметок в серии.

1 Ответ

1 голос
/ 28 марта 2019

j in zar будет сравнивать j с каждым элементом индекса zar .

Например,

0 in zar
# True

0 in zar.index
# True

Это также согласуется с поведением DataFrames, для которого in по умолчанию выполняет проверку членства в столбцах.

df = pd.DataFrame(columns=['a', 'b', 'c'])
'a' in df
# True

'd' in df
# False

Вам понадобится Series.eq (== оператор) или Series.isin вместе с Series.any.

(zar == j).any()

Подробности
zar == jвозвращает серию bools:

(zar == j)

0    False
1    False
2    False
3    False
4    False
5     True
6    False
7    False
8    False
9    False
Name: zar, dtype: bool

Затем вы вызываете any, который возвращает True, если какая-либо из строк имеет значение True.Если вы хотите индекс True, используйте np.flatnonzero:

np.flatnonzero(zar == j)
# array([5])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...