Нечетное поведение pandas для val в серии [duplicate]

Различие, или, возможно, только то, как я помню, поскольку я был под тем же впечатлением, что и исходный плакат, таков: Java всегда проходит по значению. Все объекты (в Java, все, кроме примитивов) в Java - это ссылки. Эти ссылки передаются по значению.

68
задан Community 23 May 2017 в 12:34
поделиться

3 ответа

in серии проверяет, находится ли значение в индексе:

In [11]: s = pd.Series(list('abc')) In [12]: s Out[12]: 0 a 1 b 2 c dtype: object In [13]: 1 in s Out[13]: True In [14]: 'a' in s Out[14]: False

. Один из вариантов - увидеть, есть ли он в уникальных значениях:

In [21]: s.unique() Out[21]: array(['a', 'b', 'c'], dtype=object) In [22]: 'a' in s.unique() Out[22]: True

или набор python:

In [23]: set(s) Out[23]: {'a', 'b', 'c'} In [24]: 'a' in set(s) Out[24]: True

Как указано в @DSM, он может быть более эффективным (особенно если вы просто делаете это для одного значения) просто использовать непосредственно по значениям:

In [31]: s.values Out[31]: array(['a', 'b', 'c'], dtype=object) In [32]: 'a' in s.values Out[32]: True
76
ответ дан Andy Hayden 15 August 2018 в 12:29
поделиться
  • 1
    Я не хочу знать, обязательно ли это уникально, в основном я хочу знать, есть ли там. – Michael 23 January 2014 в 23:47
  • 2
    Я думаю, что 'a' in s.values должен быть быстрее для длинной серии. – DSM 23 January 2014 в 23:48
  • 3
    @DSM Я предполагаю, что есть короткое замыкание ... Есть :) – Andy Hayden 23 January 2014 в 23:51
  • 4
    in df.id.values отлично работает. – Michael 23 January 2014 в 23:58
  • 5
    @AndyHayden Знаете ли вы, почему, для 'a' in s, панды предпочитают проверять индекс, а не значения серии? В словарях они проверяют ключи, но серия pandas должна вести себя как список или массив, нет? – Lei 22 November 2017 в 18:55

Вы также можете использовать pandas.Series.isin, хотя он немного длиннее 'a' in s.values:

In [2]: s = pd.Series(list('abc')) In [3]: s Out[3]: 0 a 1 b 2 c dtype: object In [3]: s.isin(['a']) Out[3]: 0 True 1 False 2 False dtype: bool In [4]: s[s.isin(['a'])].empty Out[4]: False In [5]: s[s.isin(['z'])].empty Out[5]: True

. Но этот подход может быть более гибким, если вам нужно сопоставить сразу несколько значений для a DataFrame (см. pandas.Series.isin )

>>> df = DataFrame({'A': [1, 2, 3], 'B': [1, 4, 7]}) >>> df.isin({'A': [1, 3], 'B': [4, 7, 12]}) A B 0 True False # Note that B didn't match 1 here. 1 False True 2 True True
11
ответ дан ffeast 15 August 2018 в 12:29
поделиться
0
ответ дан Eli B 27 October 2018 в 01:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: