yoongrammer

판다스(Pandas) 데이터 선택하기 (Selection) 본문

Data Analysis

판다스(Pandas) 데이터 선택하기 (Selection)

yoongrammer 2023. 2. 19. 20:56
728x90

목차

판다스(Pandas) 데이터 선택하기 (Selection)


Pandas는 DataFrame 또는 Series 개체의 특정 부분을 검색하고 조작할 수 있는 다양한 데이터 선택 방법을 제공합니다.

 

select를 설명하기 위해 사용하는 DataFrame은 다음과 같습니다.

column label(파란색 블록), row or index label(노란색 블록), data(회색 블록)

Selecting Columns


DataFrame에서 열의 하위 집합을 선택하려면 다음 구문을 사용해야 합니다.

df[column_list]

  • column_list: 선택하려는 열 이름의 목록

다음은 A행을 가져오는 예입니다.

df['A']
# output
2023-02-18    0.509482
2023-02-19    0.966399
2023-02-20    0.857979
2023-02-21    0.701611
2023-02-22    0.102038
2023-02-23    0.507152
Name: A, dtype: float64

 

df['A']  or df.A 결과

df.A와 결과는 동일합니다. 조회 결과는 Series 객체입니다.

 

다음은 여러 행을 가져오는 예입니다.

df[['B','D']]
# output
                   B           D
2023-02-18	0.943009    0.686995
2023-02-19	0.547649    0.293321
2023-02-20	0.899066    0.508288
2023-02-21	0.220908    0.555901
2023-02-22	0.677408    0.174801
2023-02-23	0.320705    0.498722

 

df[['B', 'D']] 결과

행 리스트를 사용하면 여러 행의 값을 가져올 수 있습니다. 조회 결과는 DataFrame 객체입니다.

Selecting Rows


DataFrame에서 행의 하위 집합을 선택하려면 다음 구문을 사용해야 합니다.

df[start:stop[:step]]

  • start: 시작 인덱스
  • stop: 종료 인덱스
  • step: 요소 사이의 단계 크기, 기본값은 1이다.

종료 인덱스는 선택에 포함되지 않습니다.

 

다음은 0부터 2번째 행을 가져오는 예입니다.

df[0:3]
# output
                     B           D
2023-02-18    0.943009    0.686995
2023-02-19    0.547649    0.293321
2023-02-20    0.899066    0.508288
2023-02-21    0.220908    0.555901
2023-02-22    0.677408    0.174801
2023-02-23    0.320705    0.498722

df['2023-02-18':'2023-02-20']
# output
                    A            B           C           D
2023-02-18    0.509482    0.943009    0.096876    0.686995
2023-02-19    0.966399    0.547649    0.465180    0.293321
2023-02-20    0.857979    0.899066    0.418911    0.508288

 

 

df[0:3] or df['2023-02-18' : '2023-02-20'] 결과

df[0:3:1]과 결과는 동일합니다.

인덱스 대신 인덱스 값을 사용해도 됩니다. df[’2023-02-18’:’2023-02-20’] 이땐 마지막 행도 가져옵니다.

 

다음은 전체 행에서 2단계식 건너뛰어 행을 가져오는 예입니다.

df[::2]
# output
                     A           B           C           D
2023-02-18    0.509482    0.943009    0.096876    0.686995
2023-02-20    0.857979    0.899066    0.418911    0.508288
2023-02-22    0.102038    0.677408    0.137984    0.174801

 

df[::2] 결과

 

728x90

Selection by label


레이블을 이용하여 선택하는 방법은 DataFrame.loc()와 DataFrame.at()이 있습니다.

 

loc

loc은 행 및 열 레이블로 DataFrame, Series에서 데이터를 선택할 수 있는 레이블 기반 인덱싱 방법입니다.

 

사용 방법은 다음과 같습니다.

 

DataFrame

df.loc[row_label [, column_label]]

  • row_label: 선택할 행의 레이블
  • column_label: 선택할 열의 레이블

시작 레이블과 끝 레이블이 모두 선택 항목에 포함됩니다.

 

Series

s.loc[index_label]

  • index_label: 인덱스 레이블

다음은 loc를 사용하는 여러 가지 예입니다.

 

행 조회

# 단일 행 조회
df.loc['2023-02-20']
# output
A    0.857979
B    0.899066
C    0.418911
D    0.508288
Name: 2023-02-20 00:00:00, dtype: float64

# slice를 이용한 행 조회
df.loc['2023-02-20':'2023-02-23']
# output
                    A            B           C           D
2023-02-20    0.857979    0.899066    0.418911    0.508288
2023-02-21    0.701611    0.220908    0.943105    0.555901
2023-02-22    0.102038    0.677408    0.137984    0.174801
2023-02-23    0.507152    0.320705    0.988959    0.498722

# list를 이용한 행 조회
df.loc[['2023-02-20', '2023-02-23']]
# output
                     A           B           C           D
2023-02-20    0.857979    0.899066    0.418911    0.508288
2023-02-23    0.507152    0.320705    0.988959    0.498722

# boolean을 이용한 행 조회
df.loc[[False, False, True, False, False, True]]
# output
                     A           B           C           D
2023-02-20    0.857979    0.899066    0.418911    0.508288
2023-02-23    0.507152    0.320705    0.988959    0.498722

 

 

 

 

 

열 조회

# 단일 열 조회
df.loc[:,'A']
# output
2023-02-18    0.509482
2023-02-19    0.966399
2023-02-20    0.857979
2023-02-21    0.701611
2023-02-22    0.102038
2023-02-23    0.507152
Name: A, dtype: float64

# slice를 이용한 열 조회
df.loc[:,'A':'C']
                     A           B           C 
2023-02-18    0.509482    0.943009    0.096876
2023-02-19    0.966399    0.547649    0.465180
2023-02-20    0.857979    0.899066    0.418911
2023-02-21    0.701611    0.220908    0.943105
2023-02-22    0.102038    0.677408    0.137984
2023-02-23    0.507152    0.320705    0.988959

# list를 이용한 열 조회
df.loc[:,['B', 'D']]
# output
                     B           D
2023-02-18    0.943009    0.686995
2023-02-19    0.547649    0.293321
2023-02-20    0.899066    0.508288
2023-02-21    0.220908    0.555901
2023-02-22    0.677408    0.174801
2023-02-23    0.320705    0.498722

# boolean을 이용한 열 조회
df.loc[:,[False, True, False, True]]
# output
                     B           D
2023-02-18    0.943009    0.686995
2023-02-19    0.547649    0.293321
2023-02-20    0.899066    0.508288
2023-02-21    0.220908    0.555901
2023-02-22    0.677408    0.174801
2023-02-23    0.320705    0.498722

 

특정 행과 열 조회

df.loc[['2023-02-20', '2023-02-23'], 'A':'C']
# output
                     A           B           C
2023-02-20    0.857979    0.899066    0.418911
2023-02-23    0.507152    0.320705    0.988959

 

df.loc[['2023-02-20', '2023-02-23'], 'A' : 'C'] 결과

at

at은 행 및 열 레이블에서 DataFrame, Series의 단일 값을 가져옵니다.

at은 단일 값에 특화돼 있어 단일 값 접근 시, loc보다 빠릅니다.

 

사용 방법은 다음과 같습니다.

DataFrame

df.at[row_label, column_label]

  • row_label: 선택할 행의 레이블
  • column_label: 선택할 열의 레이블

Series

s.at[index_label]

  • index_label: 인덱스 레이블
df.at[df.index[0], 'B']
# output
# 0.943009

s = df.loc[df.index[0]]
s.at['B']
# output
# 0.943009
df.at[df.index[0], 'B'] or s.at['B'] 결과

Selection by position


위치를 이용하여 select하는 방법은 DataFrame.iloc()와 DataFrame.iat()이 있습니다.

 

iloc

iloc은 정수 위치를 기반으로 DataFrame, Series에서 데이터를 선택할 수 있는 인덱싱 방법입니다.

index는 0부터 시작이고 slice에서 마지막 index는 포함되지 않습니다.

 

사용 방법은 다음과 같습니다.

DataFrame

df.iloc[row_index [, column_index]]

  • row_index: 선택할 행의 위치
  • column_index: 선택할 열의 위치

Series

s.iloc[index]

  • index: Series에서 선택할 요소의 위치

다음은 iloc를 사용하는 여러 가지 예입니다.

 

행 조회

# 단일 행 조회
df.iloc[0]
# output
A    0.509482
B    0.943009
C    0.096876
D    0.686995
Name: 2023-02-18 00:00:00, dtype: float64


# slice를 이용한 행 조회
df.iloc[:3]
# output
                     A           B           C           D
2023-02-18    0.509482    0.943009    0.096876    0.686995
2023-02-19    0.966399    0.547649    0.465180    0.293321
2023-02-20    0.857979    0.899066    0.418911    0.508288

# list를 이용한 행 조회
df.iloc[[2, 5]]
# output
                     A           B           C           D
2023-02-20    0.857979    0.899066    0.418911    0.508288
2023-02-23    0.507152    0.320705    0.988959    0.498722

# boolean을 이용한 행 조회
df.iloc[[False, False, True, False, False, True]]
# output
                     A           B           C           D
2023-02-20    0.857979    0.899066    0.418911    0.508288
2023-02-23    0.507152    0.320705    0.988959    0.498722

 

열 조회

# 단일 열 조회
df.iloc[:,0]
# output
2023-02-18    0.509482
2023-02-19    0.966399
2023-02-20    0.857979
2023-02-21    0.701611
2023-02-22    0.102038
2023-02-23    0.507152
Name: A, dtype: float64

# slice를 이용한 열 조회
df.iloc[:, 0:3]
                     A           B           C 
2023-02-18    0.509482    0.943009    0.096876
2023-02-19    0.966399    0.547649    0.465180
2023-02-20    0.857979    0.899066    0.418911
2023-02-21    0.701611    0.220908    0.943105
2023-02-22    0.102038    0.677408    0.137984
2023-02-23    0.507152    0.320705    0.988959

# list를 이용한 열 조회
df.iloc[:, [1,3]]
# output
                     B           D
2023-02-18    0.943009    0.686995
2023-02-19    0.547649    0.293321
2023-02-20    0.899066    0.508288
2023-02-21    0.220908    0.555901
2023-02-22    0.677408    0.174801
2023-02-23    0.320705    0.498722

# boolean을 이용한 열 조회
df.iloc[:,[False, True, False, True]]
# output
                     B           D
2023-02-18    0.943009    0.686995
2023-02-19    0.547649    0.293321
2023-02-20    0.899066    0.508288
2023-02-21    0.220908    0.555901
2023-02-22    0.677408    0.174801
2023-02-23    0.320705    0.498722

 

 

특정 행과 열 조회

df.iloc[[2, 5], 0:4]
# output
                     A           B           C
2023-02-20    0.857979    0.899066    0.418911
2023-02-23    0.507152    0.320705    0.988959

 

df.iloc[[2, 5], 0 : 4]

iat

iat은 행 및 열 레이블에서 정수 위치를 기반으로 DataFrame, Series의 단일 값을 가져옵니다.

iat은 단일 값에 특화돼 있어 단일 값 접근 시, iloc보다 빠릅니다.

index는 0부터 시작입니다.

 

사용 방법은 다음과 같습니다.

DataFrame

df.iat[row_index, column_index]

  • row_index: 선택할 행의 위치
  • column_index: 선택할 열의 위치

Series

s.iat[index]

  • index: Series에서 선택할 요소의 위치
df.iat[0, 1]
# output
# 0.943009

s = df.loc[df.index[0]]
s.iat[1]
# output
# 0.943009
df.iat[0, 1] or s.iat[1] 결과

Boolean indexing


Boolean indexing은 boolean 조건을 사용하여 DataFrame, Series에서 데이터를 선택하는 방법입니다.

 

boolean 조건은 비교 연산자, 논리 연산자를 사용해서 만듭니다.

비교 연산자

  • ‘==’, ‘≠’, ‘<’, ‘>’, ‘≤’, ‘≥’

논리 연산자

  • ‘&’ (and), ‘|’ (or)

다음은 Boolean indexing 예입니다.

# 단일 열의 값을 사용하여 데이터 선택
cond = df['A'] > 0.7
df[cond]
# output
                     A           B           C           D
2023-02-19    0.966399    0.547649    0.465180    0.293321
2023-02-20    0.857979    0.899066    0.418911    0.508288
2023-02-21    0.701611    0.220908    0.943105    0.555901

# DataFrame에서 값 선택
cond = df > 0.7
df[cond]
# output
                     A         B          C         D
2023-02-18    NaN       0.943009    NaN	      NaN
2023-02-19    0.966399  NaN         NaN	      NaN
2023-02-20    0.857979  0.899066    NaN       NaN
2023-02-21    0.701611  NaN         0.943105  NaN
2023-02-22    NaN       NaN         NaN       NaN
2023-02-23    NaN       NaN         0.988959  NaN

# 논리연산자를 사용하여 값 선택
cond = (df['A'] > 0.7) & (df['A'] < 0.8)
df[cond]
# output
                     A           B           C           D
2023-02-21    0.701611    0.220908    0.943105    0.555901

cond = (df['A'] > 0.7) | (df['C'] < 0.5)
df[cond]
# output
                     A           B           C           D
2023-02-18    0.509482    0.943009    0.096876    0.686995
2023-02-19    0.966399    0.547649    0.465180    0.293321
2023-02-20    0.857979    0.899066    0.418911    0.508288
2023-02-21    0.701611    0.220908    0.943105    0.555901
2023-02-22    0.102038    0.677408    0.137984    0.174801

 

728x90
Comments