본문 바로가기
IT/파이썬(Python)

파이썬 데이터 프레임 조건 검색(조건식, query 함수, str 함수)

by 깡타의 컴맹인생 2023. 3. 29.
반응형

데이터 프레임 검색

데이터 프레임은 파이썬에서 매우 유용하게 활용된다. 연산도 가능하지만 조건식이나 특정 함수를 활용하여 원하는 조건을 만족하는 데이터만을 추출할 수도 있다.

목차
1. 조건식
2. 데이터 프레임.query() 함수
3. 데이터 프레임.str.contains 함수
4. 데이터 프레임.str.match 함수

1. 조건식

데이터 프레임[(데이터 프레임['원하는 인덱스'] > 조건)]

데이터 프레임[(데이터 프레임['원하는 인덱스'] > 조건 & (데이터 프레임['원하는 인덱스'] < 조건)]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import numpy as np
import pandas as pd
 
df = np.random.rand(62)
print(df)
print(type(df), '\n'*2)
 
df = pd.DataFrame(df, columns = ['A''B'])
print(df)
print(type(df), '\n'*2)
 
test = df[df['A'> 0.5]
print(test)
print(type(df))
cs
[[0.92891566 0.32206965]
 [0.08549122 0.1036266 ]
 [0.85444913 0.1870647 ]
 [0.66962758 0.57223218]
 [0.43070982 0.11616733]
 [0.85880646 0.47779215]]
<class 'numpy.ndarray'> 


          A         B
0  0.928916  0.322070
1  0.085491  0.103627
2  0.854449  0.187065
3  0.669628  0.572232
4  0.430710  0.116167
5  0.858806  0.477792
<class 'pandas.core.frame.DataFrame'> 


          A         B
0  0.928916  0.322070
2  0.854449  0.187065
3  0.669628  0.572232
5  0.858806  0.477792
<class 'pandas.core.frame.DataFrame'>

데이터 프레임 내에 있는 원하는 데이터를 조건식을 이용하여 추출할 수 있다. numpy 모듈의 random.rand 함수는 0과 1 사이의 표준정규분포 난수를 랜덤으로 원하는 행과 열의 구조를 가진 matrix array를 생성한다. type 함수를 활용해 객체의 타입을 확인해 보면 numpy.ndarray 인 것을 확인할 수 있다. 그러고 나서 pd.DataFrame 함수를 이용해 데이터 프레임으로 타입을 변경해 준다. 위의 코드는 df['A'] > 0.5라는 조건을 만족하는 데이터가 표출되는 코드다. (A 이름을 가진 컬럼에서 0.5 보다 큰 데이터가 있는 행을 출력)

1
2
3
4
5
6
7
8
9
import numpy as np
import pandas as pd
 
df = np.random.rand(62)
df = pd.DataFrame(df, columns = ['A''B'])
 
test = df[(df['A'> 0.5& (df['B'< 0.3)]
print(test)
print(type(df))
cs
          A         B
0  0.385115  0.272339
1  0.682987  0.045885
2  0.232280  0.606646
3  0.698542  0.013443
4  0.172423  0.149589
5  0.285180  0.232751
<class 'pandas.core.frame.DataFrame'> 


          A         B
1  0.682987  0.045885
3  0.698542  0.013443
<class 'pandas.core.frame.DataFrame'>

2개의 조건식을 동시에 만족시키는 코드도 작성해 봤다. A라는 이름을 가진 컬럼에서 0.5 이상의 값을 가진 데이터와 B라는 이름을 가진 컬럼의 0.3 이하의 값을 가진 데이터가 출력된다.


2. 데이터 프레임.query() 함수

데이터 프레임.query('인덱스 < 원하는 조건')

데이터 프레임.query('인덱스 < 원하는 조건 & 인덱스 > 원하는 조건')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import numpy as np
import pandas as pd
 
df = np.random.rand(62)
print(df)
print(type(df), '\n'*2)
 
df = pd.DataFrame(df, columns = ['A''B'])
print(df)
print(type(df), '\n'*2)
 
test = df.query('A > 0.5 & B < 0.3')
print(test)
print(type(test))
cs
[[0.63938459 0.12254611]
 [0.66147966 0.40864394]
 [0.58219245 0.34818882]
 [0.3998225  0.57122328]
 [0.41945774 0.55680347]
 [0.85881942 0.96144738]]
<class 'numpy.ndarray'> 


          A         B
0  0.639385  0.122546
1  0.661480  0.408644
2  0.582192  0.348189
3  0.399823  0.571223
4  0.419458  0.556803
5  0.858819  0.961447
<class 'pandas.core.frame.DataFrame'> 


          A         B
0  0.639385  0.122546
<class 'pandas.core.frame.DataFrame'>

query 함수를 사용하는 경우 조건식을 사용하는 방법과 문법은 비슷하다. 작은따옴표나 큰 따옴표 안에 전체 내용을 입력해 주기 때문에 조건식을 활용하는 것보다는 더 편한 것 같다. 괄호를 입력할 필요가 사라져서 편하다.


3. 데이터 프레임.str.contains 함수

데이터 프레임['인덱스명'].str.contains('단어')

데이터 프레임.인덱스명.str.contains('단어')
1
2
3
4
5
6
7
8
9
10
11
12
import numpy as np
import pandas as pd
 
Animal = ['lion''tiger''duck''cat''dog']
Name = ['jack''zero''john''king''zzang']
 
df = pd.DataFrame(zip(Animal, Name), columns = ['Animal''Name'])
print(df)
print(type(df),'\n'*2)
 
test = df['Animal'].str.contains('ti')
print(test)
cs
  Animal   Name
0   lion   jack
1  tiger   zero
2   duck   john
3    cat   king
4    dog  zzang
<class 'pandas.core.frame.DataFrame'> 


0    False
1     True
2    False
3    False
4    False
Name: Animal, dtype: bool

위는 str.contains 함수를 사용한 예다. 동물의 종류와 이름이 담긴 리스트를 활용해 df라는 데이터 프레임을 만들었다. 그리고 Animal라는 이름을 가진 컬럼에서 'ti'라는 글자가 포함된 행을 출력한다. 조건식이나 query 함수와는 다르게 선택한 컬럼만 출력되는 것을 알 수 있다.(조건식이나 query는 다른 컬럼까지 출력되었음)

1
2
3
4
5
6
7
8
9
10
11
12
13
import numpy as np
import pandas as pd
 
Animal = ['lion''tiger''duck''cat''dog']
Name = ['jack''zero''john''king''zzang']
 
df = pd.DataFrame(zip(Animal, Name), columns = ['Animal''Name'])
print(df)
print(type(df),'\n'*2)
 
# test = df['Animal'].str.contains('ti')
test = df.Animal.str.contains('ti')
print(test)
cs
  Animal   Name
0   lion   jack
1  tiger   zero
2   duck   john
3    cat   king
4    dog  zzang
<class 'pandas.core.frame.DataFrame'> 


0    False
1     True
2    False
3    False
4    False
Name: Animal, dtype: bool

원하는 컬럼을 대괄호 [, ] 대신 메서드 형태로 데이터 프레임.컬럼명 형식으로 적어도 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
import numpy as np
import pandas as pd
 
Animal = ['lion''tiger''duck''cat''dog']
Name = ['jack''zero''john''king''zzang']
 
df = pd.DataFrame(zip(Animal, Name), columns = ['Animal''Name'])
print(df)
print(type(df),'\n'*2)
 
# test = df['Animal'].str.contains('ti')
test = df.Animal.str.contains('Ti')
print(test)
cs
  Animal   Name
0   lion   jack
1  tiger   zero
2   duck   john
3    cat   king
4    dog  zzang
<class 'pandas.core.frame.DataFrame'> 


0    False
1    False
2    False
3    False
4    False
Name: Animal, dtype: bool

별도의 속성을 지정하지 않은 경우에는 대소문자도 구분한다. 'ti'라는 단어가 포함된 데이터를 검색할 때는 tiger가 있는 행에서 True로 표시되었지만 'Ti'가 포함된 데이터를 검색한 결과는 모두 False다.

1
2
3
4
5
6
7
8
9
10
11
12
13
import numpy as np
import pandas as pd
 
Animal = ['lion''tiger''duck''cat''dog']
Name = ['jack''zero''john''king''zzang']
 
df = pd.DataFrame(zip(Animal, Name), columns = ['Animal''Name'])
print(df)
print(type(df),'\n'*2)
 
test = df['Animal'].str.contains('Ti', case = False)
# test = df.Animal.str.contains('t+i', case = False)
print(test)
cs
  Animal   Name
0   lion   jack
1  tiger   zero
2   duck   john
3    cat   king
4    dog  zzang
<class 'pandas.core.frame.DataFrame'> 


0    False
1     True
2    False
3    False
4    False
Name: Animal, dtype: bool

대소문자 구분을 피하기 위해서는 case = False라는 코드를 입력해 주면 된다. 'Ti'가 포함된 데이터를 찾으라고 했는데 tiger라고 적혀있는 데이터의 행이 True로 반환된 것을 확인할 수 있다.

 


4. 데이터 프레임.str.match 함수

데이터 프레임['인덱스명'].str.match('단어')

데이터 프레임.인덱스명.str.match('단어')
1
2
3
4
5
6
7
8
9
10
11
12
13
import numpy as np
import pandas as pd
 
Animal = ['lion''tiger''duck''cat''dog']
Name = ['jack''zero''john''king''zzang']
 
df = pd.DataFrame(zip(Animal, Name), columns = ['Animal''Name'])
print(df)
print(type(df),'\n'*2)
 
test = df['Animal'].str.match('ig', case = False)
# test = df.Animal.str.contains('t+i', case = False)
print(test)
cs
  Animal   Name
0   lion   jack
1  tiger   zero
2   duck   john
3    cat   king
4    dog  zzang
<class 'pandas.core.frame.DataFrame'> 


0    False
1    False
2    False
3    False
4    False
Name: Animal, dtype: bool

str.match은 해당 글자로 포함하고 있는 데이터인 경우에만 True로 판단한다. str.contains 함수는 이와 다르게 원하는 문자가 해당 데이터에 포함되어 있다면 True를 반환한다. 그 글자로 시작하지 않아도 된다. 두 함수 모두 정규 표현식을 활용하여 조건을 입력할 수 있다.

pandas 공식 문서에서 두 함수에 대하여 검색한 결과는 위의 사진을 참고하도록 하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
import numpy as np
import pandas as pd
 
Animal = ['lion''tiger''duck''cat''dog']
Name = ['jack''zero''john''king''zzang']
 
df = pd.DataFrame(zip(Animal, Name), columns = ['Animal''Name'])
print(df)
print(type(df),'\n'*2)
 
test = df['Animal'].str.match('ti', case = False)
# test = df.Animal.str.contains('ti', case = False)
print(test)
cs
  Animal   Name
0   lion   jack
1  tiger   zero
2   duck   john
3    cat   king
4    dog  zzang
<class 'pandas.core.frame.DataFrame'> 


0    False
1     True
2    False
3    False
4    False
Name: Animal, dtype: bool

'ig'가 아닌 'ti'로 원하는 단어로 바꿨더니 True가 반환된 것을 확인할 수 있다.


코딩을 잘하기 위해서는 검색을 하는 것이 필수다. 아래는 pandas 모듈에 대한 정보가 담겨있는 사이트다. 해당 사이트에서 본인이 원하는 함수의 기능을 알고 싶다면 검색해 볼 수 있도록 하자.

https://pandas.pydata.org/docs/index.html

 

pandas documentation — pandas 1.5.3 documentation

The reference guide contains a detailed description of the pandas API. The reference describes how the methods work and which parameters can be used. It assumes that you have an understanding of the key concepts.

pandas.pydata.org

반응형