[python] 팬더 열에 특정 값이 포함되어 있는지 확인하는 방법

Pandas 열에 특정 값을 가진 항목이 있는지 확인하려고합니다. 나는 이것을 시도했다 if x in df['id']. 나는 그것이 내가 43 in df['id']반환 한 열에 없다는 것을 알고있는 값을 먹일 때를 제외하고는 이것이 효과가 있다고 생각 했습니다 True. 누락 된 ID와 일치하는 항목 만 포함하는 데이터 프레임의 하위 집합을 df[df['id'] == 43]만들면 분명히 항목이 없습니다. Pandas 데이터 프레임의 열에 특정 값이 포함되어 있는지 확인하고 현재 방법이 작동하지 않는 이유는 무엇입니까? (참고로, 비슷한 질문에 대한 이 답변 의 구현을 사용할 때 동일한 문제가 있습니다 ).



답변

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

또는 파이썬 세트 :

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


답변

당신은 또한 사용할 수 있습니다 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


답변

found = df[df['Column'].str.contains('Text_to_search')]
print(found.count())

found.count()의지는 경기의 수를 포함

그리고 0이면 열에서 문자열을 찾을 수 없음을 의미합니다.


답변

몇 가지 간단한 테스트를 수행했습니다.

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를 사용하는 것이 가장 빠르지 만 팬더에는 더 우아한 방법이 있습니까?


답변

또는 사용 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다음 True부울에 s 가 있는지 확인합니다 Series.


답변

간단한 조건 :

if any(str(elem) in ['a','b'] for elem in df['column'].tolist()):


답변

사용하다

df[df['id']==x].index.tolist()

경우 x에 존재하는 id다음이 존재하는 곳은 빈 목록을 제공, 다른 인덱스의 목록을 반환합니다.