[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
다음이 존재하는 곳은 빈 목록을 제공, 다른 인덱스의 목록을 반환합니다.