데이터프레임 인덱싱

1. 기본 설정

데이터프레임에서 특정 데이터에 접근하기 위해 인덱스를 설정할 수 있음. pandas에서는 기본적으로 정수 인덱스를 제공하지만, 특정 열을 인덱스로 설정할 수도 있음.

데이터프레임을 생성하면 자동으로 0부터 시작하는 정수형 인덱스가 부여됨. 하지만 특정 열을 인덱스로 설정할 수도 있음.

import pandas as pd

data = {'A': [10, 20, 30], 'B': [40, 50, 60]}
df = pd.DataFrame(data)
print(df)

출력:

    A   B
0  10  40
1  20  50
2  30  60

위 데이터프레임에서 0, 1, 2는 자동으로 생성된 인덱스임.

2. 시리즈 인덱싱과 슬라이싱

시리즈는 데이터프레임의 한 열을 나타내며, 리스트처럼 특정 요소를 인덱싱하여 접근할 수 있음.

(1) 기본 인덱싱

특정 열(시리즈)을 선택하려면 df['열이름']을 사용하면 됨.

print(df['A'])

출력:

0    10
1    20
2    30
Name: A, dtype: int64

'A'라는 열이 선택되어 시리즈 형태로 출력됨.

(2) 팬시 인덱싱

여러 개의 열을 한 번에 선택할 때 리스트를 사용함.

print(df[['A', 'B']])

출력:

    A   B
0  10  40
1  20  50
2  30  60

여러 개의 열을 선택하면 데이터프레임 형태로 출력됨.

(3) 부울 인덱싱 (필터링)

특정 조건을 만족하는 행만 선택할 때 사용함.

print(df[df['A'] > 15])

출력:

    A   B
1  20  50
2  30  60

'A' 열의 값이 15보다 큰 행만 선택됨.

3. 데이터프레임 인덱싱

데이터프레임에서 행과 열을 선택하는 방법에는 lociloc이 있음.

(1) 기본

행을 선택할 때 loc[인덱스]를 사용함.

print(df.loc[1])

출력:

A    20
B    50
Name: 1, dtype: int64

인덱스 1번에 해당하는 행이 출력됨.

(2) 열 라벨로 접근

열을 선택할 때는 loc[:, '열이름']을 사용함.

print(df.loc[:, 'A'])

출력:

0    10
1    20
2    30
Name: A, dtype: int64

'A' 열만 선택됨.

(3) 팬시 인덱싱

특정 행과 열을 동시에 선택할 수 있음.

print(df.loc[[0, 2], ['A', 'B']])

출력:

    A   B
0  10  40
2  30  60

(4) 열 업데이트

기존 열의 값을 변경할 수도 있음.

df['A'] = df['A'] * 2
print(df)

출력:

    A   B
0  20  40
1  40  50
2  60  60

4. 부울 인덱싱

부울 인덱싱을 활용하면 특정 조건을 만족하는 데이터를 선택하거나 수정할 수 있음.

(1) 기본

print(df[df['A'] > 30])

출력:

    A   B
1  40  50
2  60  60

'A' 값이 30보다 큰 행만 출력됨.

(2) 항목 업데이트

특정 조건을 만족하는 행의 값을 변경할 수 있음.

df.loc[df['A'] > 30, 'B'] = 100
print(df)

출력:

    A    B
0  20   40
1  40  100
2  60  100

'A' 값이 30보다 큰 행의 'B' 값을 100으로 변경함.

5. 행 인덱싱

(1) 기본

print(df.iloc[1])

출력:

A     40
B    100
Name: 1, dtype: int64

(2) 팬시 인덱싱

여러 개의 행을 선택할 때 리스트를 사용함.

print(df.iloc[[0, 2]])

출력:

    A    B
0  20   40
2  60  100

6. 데이터프레임 슬라이싱

슬라이싱을 사용하면 특정 범위의 데이터만 선택할 수 있음.

(1) 행 슬라이싱

print(df[1:])

출력:

    A    B
1  40  100
2  60  100

(2) 열 슬라이싱

print(df.loc[:, 'A':'B'])

출력:

    A    B
0  20   40
1  40  100
2  60  100

(3) 행 & 열 슬라이싱

print(df.iloc[1:, 1:])

출력:

     B
1  100
2  100

(4) 스텝 활용

print(df[::2])

출력:

    A    B
0  20   40
2  60  100

(5) 인덱싱과 슬라이싱 조합

print(df.loc[1:, ['A', 'B']])

출력:

    A    B
1  40  100
2  60  100

(6) 부울 인덱싱 연속 적용

print(df[df['A'] > 30].iloc[:, 1])

출력:

1    100
2    100
Name: B, dtype: int64

데이터프레임 수정

1. 열 추가

데이터프레임에 새로운 열을 추가할 수 있음. 새로운 열을 추가할 때는 기존 데이터프레임에 대괄호([])를 사용하여 새로운 열을 정의하고 값을 할당하면 됨.

import pandas as pd

data = {'A': [1, 2, 3], 'B': [4, 5, 6]}
df = pd.DataFrame(data)

# 새로운 열 추가
df['C'] = [7, 8, 9]
print(df)

출력:

   A  B  C
0  1  4  7
1  2  5  8
2  3  6  9

새로운 열 'C'가 추가됨.

2. 항목 지정

특정 열의 값을 변경할 수도 있음.

# 'A' 열의 값을 변경
df['A'] = df['A'] * 10
print(df)

출력:

    A  B  C
0  10  4  7
1  20  5  8
2  30  6  9

'A' 열의 값이 10배 증가됨.

3. 행&열 지정하여 값 변경

특정 위치의 값을 변경할 수도 있음.

# 특정 위치(행, 열)의 값 변경
df.loc[1, 'B'] = 50
print(df)

출력:

    A   B  C
0  10   4  7
1  20  50  8
2  30   6  9

1번째 행의 'B' 값이 50으로 변경됨.

# 여러 개의 값을 한 번에 변경
df.loc[df['A'] > 10, 'C'] = 100
print(df)

출력:

    A   B    C
0  10   4    7
1  20  50  100
2  30   6  100

'A' 열의 값이 10보다 큰 경우, 'C' 열의 값을 100으로 변경함.


결측치 처리

결측치(Missing Value, NA)

  • 데이터에서 값이 비어있는 경우
  • Pandas에서는 NaN(Not a Number) 또는 NA(Not Available)로 표현됨.

1. 결측치 확인

데이터에서 결측치(NA)를 확인하는 방법으로 isna(), notna(), isnull(), notnull()이 있음.

(1) isna()

각 요소가 결측치인지 확인하여 True/False로 반환함.

df.isna()
import pandas as pd
import numpy as np

data = {'A': [1, np.nan, 3], 'B': [4, 5, np.nan]}
df = pd.DataFrame(data)
print(df.isna())

출력:

       A      B
0  False  False
1   True  False
2  False   True

(2) notna()

결측치가 아닌 값을 True로 반환함.

df.notna()
print(df.notna())

출력:

       A      B
0   True   True
1  False   True
2   True  False

(3) isnull()

isna()와 동일한 기능을 함.

df.isnull()
print(df.isnull())

출력:

       A      B
0  False  False
1   True  False
2  False   True

(4) notnull()

df.notnull()

notna()와 동일한 기능을 함.

print(df.notnull())

출력:

       A      B
0   True   True
1  False   True
2   True  False

2. 결측치 여부 확인 (any(), all())

(1) any()

하나라도 결측치가 있으면 True를 반환함.

df.isna().any()
print(df.isna().any())

출력:

A     True
B     True
dtype: bool

(2) all()

모든 값이 결측치일 경우에만 True를 반환함.

df.isna().all()
print(df.isna().all())

출력:

A    False
B    False
dtype: bool

3. 결측치 제거 (dropna())

dropna()를 사용하여 결측치가 포함된 행 또는 열을 제거할 수 있음.

(1) 행 제거

df.dropna()
print(df.dropna())

출력:

     A    B
0  1.0  4.0

(2) 열 제거

df.dropna(axis=1)
print(df.dropna(axis=1))

4. 결측치 대체 (fillna())

(1) 특정 값으로 채우기

df.fillna()
print(df.fillna(0))

출력:

     A    B
0  1.0  4.0
1  0.0  5.0
2  3.0  0.0

(2) 이전 값으로 채우기 (ffill)

df.fillna(method='ffill')
print(df.fillna(method='ffill'))

출력:

     A    B
0  1.0  4.0
1  1.0  5.0
2  3.0  5.0

(3) 이후 값으로 채우기 (bfill)

df.fillna(method='bfill')
print(df.fillna(method='bfill'))

출력:

     A    B
0  1.0  4.0
1  3.0  5.0
2  3.0  NaN

0개의 댓글