팬더 DataFrame에 대해 'in'과 'not in'을 구현하는 방법은 무엇입니까?
팬더 이벤트 두 가지 방법 : Series.isin
및 DataFrame.isin
각각 시리즈 및 DataFrames에 대해.
하나의 열을 기준으로 데이터 프레임 필터링 (시리즈에도 적용)
가장 일반적인 시나리오는 isin
특정 열에 조건을 적용하여 DataFrame에서 행을 필터링하는 것입니다.
df = pd.DataFrame({'countries': ['US', 'UK', 'Germany', np.nan, 'China']})
df
countries
0 US
1 UK
2 Germany
3 China
c1 = ['UK', 'China'] # list
c2 = {'Germany'} # set
c3 = pd.Series(['China', 'US']) # Series
c4 = np.array(['US', 'UK']) # array
Series.isin
다양한 유형을 입력으로 받아들입니다. 다음은 원하는 것을 얻는 유효한 방법입니다.
df['countries'].isin(c1)
0 False
1 True
2 False
3 False
4 True
Name: countries, dtype: bool
# `in` operation
df[df['countries'].isin(c1)]
countries
1 UK
4 China
# `not in` operation
df[~df['countries'].isin(c1)]
countries
0 US
2 Germany
3 NaN
# Filter with `set` (tuples work too)
df[df['countries'].isin(c2)]
countries
2 Germany
# Filter with another Series
df[df['countries'].isin(c3)]
countries
0 US
4 China
# Filter with array
df[df['countries'].isin(c4)]
countries
0 US
1 UK
많은 열에서 필터링
경우에 따라 여러 열에 대해 일부 검색어와 함께 'in'멤버십 확인을 적용하려고 할 수 있습니다.
df2 = pd.DataFrame({
'A': ['x', 'y', 'z', 'q'], 'B': ['w', 'a', np.nan, 'x'], 'C': np.arange(4)})
df2
A B C
0 x w 0
1 y a 1
2 z NaN 2
3 q x 3
c1 = ['x', 'w', 'p']
isin
"A"및 "B"열 모두에 조건 을 적용하려면 DataFrame.isin
다음을 사용하십시오 .
df2[['A', 'B']].isin(c1)
A B
0 True True
1 False False
2 False False
3 False True
이것으로부터 적어도 하나의 열이있는 행을 유지하기 위해True
any
첫 번째 축을 따라 사용할 수 있습니다 .
df2[['A', 'B']].isin(c1).any(axis=1)
0 True
1 False
2 False
3 True
dtype: bool
df2[df2[['A', 'B']].isin(c1).any(axis=1)]
A B C
0 x w 0
3 q x 3
모든 열을 검색하려면 열 선택 단계를 생략하고 수행하십시오.
df2.isin(c1).any(axis=1)
마찬가지로 모든 열이있는 행을 유지True
하려면 all
이전과 동일한 방식으로 사용 하십시오.
df2[df2[['A', 'B']].isin(c1).all(axis=1)]
A B C
0 x w 0
주목할만한 언급 : numpy.isin
,, query
목록 이해 (문자열 데이터)
위에서 설명한 방법 외에도 numpy equivalent :을 사용할 수도 있습니다 numpy.isin
.
# `in` operation
df[np.isin(df['countries'], c1)]
countries
1 UK
4 China
# `not in` operation
df[np.isin(df['countries'], c1, invert=True)]
countries
0 US
2 Germany
3 NaN
고려할 가치가있는 이유는 무엇입니까? NumPy 함수는 일반적으로 오버 헤드가 낮아 팬더에 비해 약간 빠릅니다. 이는 인덱스 정렬에 의존하지 않는 요소 별 연산이므로,이 방법이 pandas를 대체 할 수없는 상황은 거의 없습니다 isin
.
문자열 작업은 벡터화하기 어렵 기 때문에 문자열 작업시 팬더 루틴은 일반적으로 반복됩니다. 여기서 목록 이해력이 더 빠를 것이라는 많은 증거가 있습니다. . 우리는 in
지금 수표에 의지한다 .
c1_set = set(c1) # Using `in` with `sets` is a constant time operation...
# This doesn't matter for pandas because the implementation differs.
# `in` operation
df[[x in c1_set for x in df['countries']]]
countries
1 UK
4 China
# `not in` operation
df[[x not in c1_set for x in df['countries']]]
countries
0 US
2 Germany
3 NaN
그러나 지정하기가 훨씬 더 어려우므로 수행중인 작업을 모르는 경우 사용하지 마십시오.
마지막 으로이 답변DataFrame.query
에서 다루는 내용 도 있습니다 . numexpr FTW!