본문 바로가기
Sketch (Programming Language)/Python

Pandas(5)

by 생각하는 이상훈 2024. 2. 4.
728x90

인덱싱

pandas의 인덱싱에 대해서 알아볼 것이다. 레이블기반 인덱싱, 정수기반 인덱싱, 앞에서 또는 뒤에서 n행 인덱싱, 멀티 인덱싱에 대해서 차근차근 알아보자.


레이블기반(스칼라)

기본적으로 DataFrame.at의 형태를 띈다. at 함수는 loc 함수와 같이 레이블 기반으로 인덱싱을 하지만, DataFrame과 Series에 상관없이 하나의 스칼라값에 접근한다는 차이가 존재한다. 행/열 한쌍에 대한 단일 값에 엑세스한다는 특징이 있다. 사용법은 아래와 같이 단순하게 이용할 수 있다.

값 가져오기 : result = df.at['행', '열']
값 설정하기 : df.at['행', '열'] = value


예시

먼저 아래와 같이 기본적인 2x2 행렬을 만든다.

df = pd.DataFrame([[1,2], [3,4]], index=['row1', 'row2'], columns=['col1', 'col2'])
print(df)
>>
     col1 col2
row1   1    2 
row2   3    4

 

행, 열 값을 인수로 입력하여 변수에 할당함으로써 값을 가져올 수 있다.

result = df.at['row1', 'col2']
print(result)
>> 2

행, 열 값을 인수로 지정 후 값을 할당하여 값을 설정할 수 있다.

df.at['row2', 'col1'] = '변경'
print(df)
     col1 col2
row1   1    2 
row2  변경   4

loc 메서드를 이용해 Series로 추출한 뒤 at메서드를 이용해 스칼라값을 얻는 방식으로 활용이 가능하다.

Copy df.loc['row2'].at['col2']
 >> 4

레이블기반(데이터)

기본적으로 DataFrame.loc의 형태를 갖는다. loc 함수는 at 함수와 같이 레이블 기반으로 인덱싱을 한다. DataFrame이나 Series형식으로의 반환이 필요하면 loc를 사용한다. 행/열 설정에 따라 자유로운 인덱싱이 가능하고 loc은 bool 배열과 함께 사용이 가능하다. 사용방법은 아래와 같다.


값 가져오기 : result = df.loc['행', '열']
값 설정하기 : df.loc['행', '열'] = value

입력 가능한 Input은 아래와 같다.


1. 레이블 (만약 3을 입력할 경우 정수위치가 아닌 index의 레이블로 해석)
2. list 객체 (예 : ['a', 'b', 'c'])
3. 레이블의 슬라이스 객체 (예 : 'b' : 'f')
4. 슬라이싱되는 축과 길이가 같은 bool 배열 (예 : [True, True, False, True])


예시

먼저, 아래와 같이 기본적인 3x3 행렬을 만든다.




단일 레이블을 지정할경우 Series 형태로 반환됩니다.

result = df.loc['row1']
print(result)
>> 
col1  1
col2  2
col3  3
Name: row1, dtype: int64


레이블로 구성된 리스트. [ [ ] ]를 사용하면 DataFrame형태로 반환됩니다.

result = df.loc[ ['row1','row'3] ]
print(result)
>>
    col1 col2 col3
row1  1    2    3
row3  7    8    9


행과 열을 설정하여 단일 레이블의 값을 입력가능하다.

result = df.loc['row2', 'col2']
print(result)
>> 5

 

슬라이스를 이용하여 인덱싱을 할 수 있다.

result = df.loc['row1' : 'row3', 'col2']
print(result)
>>
    col2
row1  1
row2  4
row3  7
Name : col2, dtype: int64


bool로 구성된 list를 이용하여 인덱싱을 할 수 있다.

bool = [False, True, False] # row2에 대응되는 값만 True
result = df.loc[bool] 
     col1  col2  col3
row2   4     5     6


bool로 구성된 Series를 반환하는 조건문의 사용도 가능하다. 아래의 경우 col3열에 대해서 5보다 큰 경우인 row2, row3행만 반환된다.

result = df.loc[ df['col3'] > 5 ]
print(result)
>>
     col1 col2 col3
row2   4    5    6
row3   7    8    9

여기에 해당조건을 만족하는 특정 열을 반환할 수도 있다. 아래의 경우 col3에서 5보다 큰 값을 만족하는 행에 대해서 col2의 값만 반환한다.

result = df.loc[ df['col3'] > 5, ['col2'] ] 
print(result)
>>
     col2
row2   5
row3   8


람다함수를 이용하여 인덱싱이 가능하다. 아래의 경우 col2의 값중 5인 값을 만족하는 행을 반환한다.

result = df.loc[lambda df : df['col2'] == 5]
print(result)
>>
     col1 col2 col3
row2   4    5    6


기본적으로 조건을 만족하는 모든 항목의 값이 변경된다.

df.loc[ ['row1', 'row3'], ['col3'] ] = 'A'
print(df)
>>
     col1 col2 col3
row1   1    2    A
row2   4    5    6
row3   7    8    A


하나의 레이블만 지정할 경우 해당 행/열 전체의 값 설정이 가능하다.

df.loc[ ['row1'] ] = 'A' # 행을 변경할 경우
print(df)
>>
     col1 col2 col3
row1   A    A    A
row2   4    5    6
row3   7    8    9
df.loc[ : , ['col3'] ] = 'B' # 열을 변경할 경우 행을 전체선택 ( : ) 해줍니다.
print(df)
>>
     col1 col2 col3
row1   1    2    B
row2   4    5    B
row3   7    8    B


조건을 설정하여 만족하는 값의 변경이 가능하다.
아래의 경우 col2에서 3보다 큰 열은 row2, row3이기 때문에 해당 열의 값이 전부 변경되었다.

Copydf.loc[df['col2'] > 3] = 'A'
     col1 col2 col3
row1   1    2    3
row2   A    A    A
row3   A    A    A

728x90

'Sketch (Programming Language) > Python' 카테고리의 다른 글

프로그래머스 - 추억 점수  (0) 2024.05.04
프로그래머스 - 소수 만들기  (0) 2024.05.02
Pandas(4)  (1) 2024.01.31
Baekjoon Training #14888  (0) 2023.08.27
Pandas(3)  (0) 2023.08.23