Python/NumPy | Pandas

[Python] Pandas - 데이터프레임 데이터 조작 2

비번변경 2022. 12. 21. 20:26

개요

2022.12.20 - [Python] Pandas - 데이터프레임 데이터 조작 1에 이어 데이터 조작 방법을 마저 정리한다.

 

 

apply

행이나 열 단위로 복잡한 처리를 할 때 사용할 수 있는 함수다. 매개변수로 행 또는 열을 받는 함수를 넣으면 각 열 또는 행을 반복하여 그 함수에 적용시킨다.

 

예로 들어 아래의 데이터가 있다고 하자.

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

# 실행 결과
   A  B  C
0  1  2  1
1  3  3  5
2  4  1  2
3  3  2  4
4  4  3  4

각 열의 최대값과 최솟값의 차이는 아래와 같이 계산할 수 있다.

df3.apply(lambda x: x.max() - x.min())

# 실행 결과
A    3
B    2
C    4
dtype: int64

 

행에 대한 계산을 할 때는 axis=1로 설정하여 계산한다.

df3.apply(lambda x: x.max() - x.min(), axis=1)

# 실행 결과
0    1
1    2
2    3
3    2
4    1
dtype: int64

 

각 열에 대해 어떤 값이 얼마나 사용됐는지 확인할 때는 value_counts 함수를 전달한다.

df3.apply(pd.value_counts)

# 실행 결과
     A    B    C
1  1.0  1.0  1.0
2  NaN  2.0  1.0
3  2.0  2.0  NaN
4  2.0  NaN  2.0
5  NaN  NaN  1.0

 

fillna

fillna 함수는 NaN을 다른 값으로 바꿀 때 사용한다.

df3.apply(pd.value_counts).fillna(0)

# 실행 결과
     A    B    C
1  1.0  1.0  1.0
2  0.0  2.0  1.0
3  2.0  2.0  0.0
4  2.0  0.0  2.0
5  0.0  0.0  1.0

 

 

astype

astype은 데이터의 자료형을 바꿀 때 사용한다.

df3.apply(pd.value_counts).fillna(0).astype(int)

# 실행 결과
   A  B  C
1  1  1  1
2  0  2  1
3  2  2  0
4  2  0  2
5  0  0  1

 

 

실수 값을 카테고리 값으로 변환하기

실수 값을 크기를 기준으로 하여 카테고리 값으로 변환할 때는 아래와 같은 명령을 사용할 수 있다.

  • cut : 실수 값의 경계선 지정
  • qcut : 갯수가 동일한 구간으로 나눈다.

예로 들어 아래와 같은 나이 데이터가 있을 때,

ages = [0, 2, 10, 21, 23, 37, 31, 61, 20, 41, 32, 101]

cut 함수에 카테고리를 나누는 기준값 bin, label를 지정하면 데이터를 카테고리로 변경한다. 영역에 포함되지 않는 데이터는 NaN으로 처리된다.

bins = [1, 20, 30, 50, 70, 100]
labels = ['미성년자', '청년' , '중년', '장년', '노년']
cats = pd.cut(ages, bins, labels=labels)
cats

# 실행 결과
[NaN, '미성년자', '미성년자', '청년', '청년', ..., '장년', '미성년자', '중년', '중년', NaN]
Length: 12
Categories (5, object): ['미성년자' < '청년' < '중년' < '장년' < '노년']

cut 함수는 Categorical 객체를 반환하는데 categories 속성으로 라벨 문자열을, codes 속성으로 정수로 인코딩한 카테고리 값을 가진다.

cats.categories
cats.codes

# 실행 결과
Index(['미성년자', '청년', '중년', '장년', '노년'], dtype='object')
array([-1,  0,  0,  1,  1,  2,  2,  3,  0,  2,  2, -1], dtype=int8)

 

qcut은 데이터 개수가 동일하도록 지정한 수의 구간으로 나눈다.

data = np.random.randn(1000)
cats = pd.qcut(data, 4, labels=["Q1", "Q2", "Q3", "Q4"])
cats
cats.value_counts()

# 실행 결과
['Q4', 'Q2', 'Q2', 'Q4', 'Q4', ..., 'Q1', 'Q1', 'Q2', 'Q4', 'Q3']
Length: 1000
Categories (4, object): ['Q1' < 'Q2' < 'Q3' < 'Q4']

Q1    250
Q2    250
Q3    250
Q4    250
dtype: int64

 

 

실행 결과

데이터 사이언스 스쿨 - 4.4 데이터프레임의 데이터 조작