Pandas에서 인덱싱 및 슬라이싱하는 방법

Pandas에서 인덱싱 및 슬라이싱하는 방법

Pandas
Pandas에서 인덱싱 및 슬라이싱하는 방법
Author

gabriel yang

Published

August 29, 2024

Pandas는 데이터 분석을 위한 가장 강력한 도구 중 하나로, 데이터프레임에서 필요한 데이터를 선택하고 조작하는 데 다양한 인덱싱 및 슬라이싱 기능을 제공합니다. 이 글에서는 Pandas에서 데이터를 인덱싱하고 슬라이싱하는 방법에 대해 단계별로 설명하겠습니다.

1. 데이터프레임과 시리즈에서 기본적인 인덱싱

Pandas의 데이터프레임(DataFrame)은 행과 열로 구성된 2차원 자료구조입니다. 데이터프레임의 각 열은 시리즈(Series)라는 1차원 자료구조로 나타낼 수 있습니다.

import pandas as pd

# 예시 데이터프레임 생성
data = {'이름': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
        '나이': [25, 32, 23, 35, 29],
        '점수': [85, 88, 91, 79, 95]}
df = pd.DataFrame(data)
display(df)
이름 나이 점수
0 Alice 25 85
1 Bob 32 88
2 Charlie 23 91
3 David 35 79
4 Eva 29 95

테스트를 위한 데이터프레임을 생성합니다.

# 특정 열 선택 (Series 반환)
name_series = df['이름']
name_series
0      Alice
1        Bob
2    Charlie
3      David
4        Eva
Name: 이름, dtype: object

위 예시에서 df['이름']이름 열을 선택하여 시리즈를 반환합니다. 이렇게 특정 열을 선택하는 기본적인 인덱싱 방식은 간단하면서도 자주 사용됩니다.

2. .loc[].iloc[]를 이용한 인덱싱

.loc[].iloc[]는 데이터프레임에서 행과 열을 선택할 때 주로 사용하는 메서드입니다. 이 둘의 차이점과 사용 방법을 살펴보겠습니다.

2.1. .loc[]: 라벨(Label) 기반 인덱싱

.loc[]는 데이터프레임의 라벨(인덱스와 컬럼 이름)을 기준으로 데이터를 선택합니다.

# 라벨을 사용한 행 선택
display(df)
row_loc = df.loc[2]
display(row_loc)
이름 나이 점수
0 Alice 25 85
1 Bob 32 88
2 Charlie 23 91
3 David 35 79
4 Eva 29 95
이름    Charlie
나이         23
점수         91
Name: 2, dtype: object

위 코드에서 .loc[]는 행과 열 라벨을 사용하여 데이터를 선택합니다. df.loc[2]는 2번째 인덱스에 해당하는 전체 행을 반환합니다. 인덱스는 0부터 시작하기 때문에 3번째열의 정보가 지정됩니다.

# 라벨을 사용한 특정 행과 열 선택
display("데이터프레임")
display(df)
cell_loc = df.loc[2, '이름']
display("슬라이싱 결과")
display(cell_loc)
'데이터프레임'
이름 나이 점수
0 Alice 25 85
1 Bob 32 88
2 Charlie 23 91
3 David 35 79
4 Eva 29 95
'슬라이싱 결과'
'Charlie'

df.loc[2, '이름']은 2번째 행의 이름 열 값을 반환합니다.

# 라벨을 사용한 슬라이싱 (2번째부터 4번째 행까지)
display("데이터프레임")
display(df)
slice_loc = df.loc[1:3]
display("슬라이싱 결과")
display(slice_loc)
'데이터프레임'
이름 나이 점수
0 Alice 25 85
1 Bob 32 88
2 Charlie 23 91
3 David 35 79
4 Eva 29 95
'슬라이싱 결과'
이름 나이 점수
1 Bob 32 88
2 Charlie 23 91
3 David 35 79

loc()함수를 사용한 슬라이싱 문법은 sequence[start:stop:step]와 같습니다. .loc함수에 슬라이싱을 사용하면 start와 stop을 포함하는 위치를 지정하고 결과는 1,2,3열이 슬라이싱되어 출력됩니다.

2.2. .iloc[]: 정수(Integer) 기반 인덱싱

.iloc[]는 정수 인덱스를 사용하여 데이터를 선택합니다. 이는 데이터프레임의 실제 위치를 기준으로 합니다.

display("데이터프레임")
display(df)
# 정수를 사용한 행 선택
row_iloc = df.iloc[2]
display(row_iloc)

# 정수를 사용한 특정 행과 열 선택
cell_iloc = df.iloc[2, 0]
display(cell_iloc)

# 정수를 사용한 슬라이싱 (1번째부터 3번째 행까지)
slice_iloc = df.iloc[1:4]
display(slice_iloc)
'데이터프레임'
이름 나이 점수
0 Alice 25 85
1 Bob 32 88
2 Charlie 23 91
3 David 35 79
4 Eva 29 95
이름    Charlie
나이         23
점수         91
Name: 2, dtype: object
'Charlie'
이름 나이 점수
1 Bob 32 88
2 Charlie 23 91
3 David 35 79

.iloc[]는 정수 인덱스를 사용하여 데이터를 선택하며, df.iloc[2]는 세 번째 행의 전체 데이터를 반환합니다. 또한 df.iloc[2, 0]은 세 번째 행의 첫 번째 열 데이터를 반환합니다.

3. 조건을 사용한 인덱싱

Pandas에서는 특정 조건을 만족하는 데이터를 필터링할 수 있습니다. 이를 통해 조건에 맞는 행을 선택할 수 있습니다.

# 나이가 30 이상인 사람들 선택
age_filter = df[df['나이'] >= 30]
display(age_filter)

# 이름이 'Alice'인 사람 선택
name_filter = df[df['이름'] == 'Alice']
display(name_filter)
이름 나이 점수
1 Bob 32 88
3 David 35 79
이름 나이 점수
0 Alice 25 85

위 코드에서는 조건식을 사용하여 데이터를 필터링합니다. df['나이'] >= 30은 나이가 30 이상인 행을 필터링하고, df['이름'] == 'Alice'는 이름이 ’Alice’인 행을 선택합니다.

4. 열과 행을 동시에 선택하기

데이터프레임에서 특정 행과 열을 동시에 선택하려면 .loc[].iloc[]를 결합하여 사용하면 됩니다.

# 특정 행과 열 동시 선택
specific_cell = df.loc[2, '점수']
display(specific_cell)

# 특정 행과 여러 열 동시 선택
multiple_cells = df.loc[2, ['이름', '점수']]
display(multiple_cells)

# 여러 행과 여러 열 동시 선택
subset = df.loc[1:3, ['이름', '점수']]
display(subset)
91
이름    Charlie
점수         91
Name: 2, dtype: object
이름 점수
1 Bob 88
2 Charlie 91
3 David 79

이 경우, df.loc[2, '점수']는 두 번째 인덱스 행의 점수 열을 반환하며, df.loc[2, ['이름', '점수']]는 이름과 점수 열의 데이터를 반환합니다.

5. 인덱스 설정과 재설정

Pandas에서 인덱스를 특정 열로 설정하거나, 인덱스를 기본 정수 인덱스로 재설정할 수 있습니다.

# '이름'을 인덱스로 설정
df_with_index = df.set_index('이름')
display(df_with_index)

# 인덱스를 다시 기본 정수 인덱스로 설정
df_reset = df_with_index.reset_index()
display(df_reset)
나이 점수
이름
Alice 25 85
Bob 32 88
Charlie 23 91
David 35 79
Eva 29 95
이름 나이 점수
0 Alice 25 85
1 Bob 32 88
2 Charlie 23 91
3 David 35 79
4 Eva 29 95

set_index() 메서드는 특정 열을 인덱스로 설정하며, reset_index()는 인덱스를 기본 정수 인덱스로 재설정합니다.