source

Panda 데이터 프레임에서 문자열 패턴이 포함된 행을 필터링하는 방법

goodcode 2022. 9. 22. 00:21
반응형

Panda 데이터 프레임에서 문자열 패턴이 포함된 행을 필터링하는 방법

Python Panda의 데이터 프레임은 다음과 같습니다.

df = pd.DataFrame({'vals': [1, 2, 3, 4], 'ids': [u'aball', u'bball', u'cnut', u'fball']})

또는 표 형식으로:

ids    vals
aball   1
bball   2
cnut    3
fball   4

키워드 "볼"이 포함된 행을 필터링하려면 어떻게 해야 합니까?예를 들어, 출력은 다음과 같습니다.

ids    vals
aball   1
bball   2
fball   4
In [3]: df[df['ids'].str.contains("ball")]
Out[3]:
     ids  vals
0  aball     1
1  bball     2
3  fball     4
df[df['ids'].str.contains('ball', na = False)] # valid for (at least) pandas version 0.17.1

단계별 설명(내부에서 외부로):

  • df['ids']를 선택합니다.ids데이터 프레임의 열(기술적으로는 객체)df['ids']종류pandas.Series)
  • df['ids'].str벡터화된 문자열 메서드를 적용할 수 있습니다(예:lower,contains)를 시리즈로
  • df['ids'].str.contains('ball')는 시리즈의 각 요소를 체크하여 요소 값에 '볼' 문자열이 하위 문자열로 포함되어 있는지 여부를 확인합니다.그 결과는 일련의 부울란으로 인해True또는False'볼' 서브스트링의 존재에 대해서요
  • df[df['ids'].str.contains('ball')]는 부울 '마스크'를 데이터 프레임에 적용하고 적절한 레코드를 포함하는 뷰를 반환합니다.
  • na = False는 NA/NaN 값을 대상에서 삭제합니다.그렇지 않으면 ValueError가 반환될 수 있습니다.
>>> mask = df['ids'].str.contains('ball')    
>>> mask
0     True
1     True
2    False
3     True
Name: ids, dtype: bool

>>> df[mask]
     ids  vals
0  aball     1
1  bball     2
3  fball     4

필터링할 열을 새 인덱스로 설정할 경우 를 사용하는 것도 고려할 수 있습니다.다른 열로 유지할 경우,str.contains가는 길이에요.

예를 들어 다음과 같이 합시다.

df = pd.DataFrame({'vals': [1, 2, 3, 4, 5], 'ids': [u'aball', u'bball', u'cnut', u'fball', 'ballxyz']})

       ids  vals
0    aball     1
1    bball     2
2     cnut     3
3    fball     4
4  ballxyz     5

모든 행을 필터링할 계획입니다.ids포함하다ballAND 세트ids새로운 인덱스로서

df.set_index('ids').filter(like='ball', axis=0)

그러면

         vals
ids          
aball       1
bball       2
fball       4
ballxyz     5

그렇지만filter또한 정규식을 전달할 수 있으므로 열 엔트리가 로 끝나는 행만 필터링할 수 있습니다.ball이 경우,

df.set_index('ids').filter(regex='ball$', axis=0)

       vals
ids        
aball     1
bball     2
fball     4

이제 다음 엔트리가 있는 것에 주의해 주세요.ballxyz로 시작하는 것은 포함되어 있지 않습니다.ball그것으로 끝나지 않습니다.

로 시작하는 모든 엔트리를 가져오려면ball간단하게 사용할 수 있습니다.

df.set_index('ids').filter(regex='^ball', axis=0)

굴곡성

         vals
ids          
ballxyz     5

컬럼에서도 동일하게 동작합니다.변경할 필요가 있는 것은,axis=0열을 기준으로 필터링을 하면axis=1.

언급URL : https://stackoverflow.com/questions/27975069/how-to-filter-rows-containing-a-string-pattern-from-a-pandas-dataframe

반응형