Я пытаюсь определить, есть ли запись в столбце Pandas, который имеет определенное значение. Я попытался сделать это с помощью if x in df['id']
. Я думал, что это работает, за исключением случаев, когда я накормил это значение, которое, как я знал, не было в столбце 43 in df['id']
, оно все еще возвращалось True
. Когда я подмножаюсь к кадру данных, содержащему только записи, соответствующие отсутствующему id df[df['id'] == 43]
, в нем нет, очевидно, записей. Как определить, содержит ли столбец в кадре данных Pandas определенное значение и почему мой текущий метод не работает? (FYI, у меня такая же проблема, когда я использую реализацию в этом ответе на аналогичный вопрос).
Как определить, содержит ли столбец Pandas определенное значение
Ответ 1
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
Один из вариантов заключается в том, чтобы увидеть, находится ли он в unique значениях:
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
Ответ 2
Вы также можете использовать 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
Но этот подход может быть более гибким, если вам нужно сопоставить сразу несколько значений для DataFrame (см. DataFrame.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
Ответ 3
found = df[df['Column'].str.contains('Text_to_search')]
print(found.count())
found.count()
будет содержать количество совпадений
И если это 0, то означает, что строка не была найдена в столбце.
Ответ 4
Простое условие:
if any(str(elem) in ['a','b'] for elem in df['column'].tolist()):
Ответ 5
Или используйте Series.tolist
или Series.any
:
>>> s = pd.Series(list('abc'))
>>> s
0 a
1 b
2 c
dtype: object
>>> 'a' in s.tolist()
True
>>> (s=='a').any()
True
Series.tolist
делает список о Series
, а другой я просто получаю булевскую Series
из регулярной Series
, а затем проверяю, есть ли в булевой Series
True
.
Ответ 6
Я не предлагаю использовать "значение в серии", которое может привести ко многим ошибкам. Пожалуйста, смотрите этот ответ для деталей: Использование в операторе с сериями Pandas
Ответ 7
Я сделал несколько простых тестов:
In [10]: x = pd.Series(range(1000000))
In [13]: timeit 999999 in x.values
567 µs ± 25.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [15]: timeit x.isin([999999]).any()
9.54 ms ± 291 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [16]: timeit (x == 999999).any()
6.86 ms ± 107 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [17]: timeit 999999 in set(x)
79.8 ms ± 1.98 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [21]: timeit x.eq(999999).any()
7.03 ms ± 33.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [22]: timeit x.eq(9).any()
7.04 ms ± 60 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [24]: timeit 9 in x.values
666 µs ± 15.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Интересно, что не имеет значения, если вы посмотрите 9 или 999999, кажется, что использование синтаксиса in занимает примерно столько же времени (должно быть, используется бинарный поиск)
In [24]: timeit 9 in x.values
666 µs ± 15.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [25]: timeit 9999 in x.values
647 µs ± 5.21 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [26]: timeit 999999 in x.values
642 µs ± 2.11 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [27]: timeit 99199 in x.values
644 µs ± 5.31 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [28]: timeit 1 in x.values
667 µs ± 20.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Похоже, использование x.values является самым быстрым, но, возможно, в пандах есть более элегантный способ?
Ответ 8
использование
df[df['id']==x].index.tolist()
Если x
присутствует в id
то он вернет список индексов, где он присутствует, иначе он даст пустой список.