데이터 분석/Python - pandas

[이론] 기능의 반복적 적용

toraa 2025. 1. 14. 14:30

pandas에 없는 기능 활용하기

dataframe도 리스트랑 똑같이 반복문 사용할 수 있

 

1. for문 활용

DataFrame : 컬럼이름
.iloc: 순서에 따른 row 시리즈
items(): (컬럼이름, 해당컬럼 시리즈)
iterrows(): (인덱스, 해당로우 시리즈)

 

import pandas as pd 
df_hc = pd.read_csv('data/국민건강보험공단_건강검진정보(샘플).csv', index_col=0).iloc[:5,:5]
df_hc

 

DataFrame 사용

for i in df_hc:
    print(i)
    
    
성별
연령대코드(5세단위)
신장(5cm단위)
수축기혈압
이완기혈압

in뒤에 바로 DF 넣으면 컬럼 이름이 반환 (컬럼들 반복)

 

items() 사용

for col, ser in df_hc.items():
    print('col: ', col)
    print('ser: ', ser)
    print('-'*20)
    
    
col:  성별
ser:  가입자일련번호
1692       남자
3762511    남자
668704     여자
1225411    남자
4342771    여자
Name: 성별, dtype: object
--------------------
col:  연령대코드(5세단위)
ser:  가입자일련번호
1692       50
3762511    45
668704     65
1225411    45
4342771    35
Name: 연령대코드(5세단위), dtype: int64
--------------------
col:  신장(5cm단위)
ser:  가입자일련번호
1692       170
3762511    170
668704     150
1225411    170
4342771    165
Name: 신장(5cm단위), dtype: int64
--------------------
col:  수축기혈압
ser:  가입자일련번호
1692       102.0
3762511    123.0
668704     129.0
1225411    121.0
4342771    123.0
Name: 수축기혈압, dtype: float64
--------------------
col:  이완기혈압
ser:  가입자일련번호
1692       69.0
3762511    81.0
668704     79.0
1225411    76.0
4342771    73.0
Name: 이완기혈압, dtype: float64
--------------------

컬럼 이름을 가져오고, 컬럼에 해당하는 데이터 시리즈까지 반환

 

.iloc : 관측치에 해당하는 데이터 시리즈가 반환 (순서대로)

for i in df_hc.iloc:
    print(i)


성별                남자
연령대코드(5세단위)       50
신장(5cm단위)        170
수축기혈압          102.0
이완기혈압           69.0
Name: 1692, dtype: object
성별                남자
연령대코드(5세단위)       45
신장(5cm단위)        170
수축기혈압          123.0
이완기혈압           81.0
Name: 3762511, dtype: object
성별                여자
연령대코드(5세단위)       65
신장(5cm단위)        150
수축기혈압          129.0
이완기혈압           79.0
Name: 668704, dtype: object
성별                남자
연령대코드(5세단위)       45
신장(5cm단위)        170
수축기혈압          121.0
이완기혈압           76.0
Name: 1225411, dtype: object
성별                여자
연령대코드(5세단위)       35
신장(5cm단위)        165
수축기혈압          123.0
이완기혈압           73.0
Name: 4342771, dtype: object

 

iterrows() 사용

for ind, row in df_hc.iterrows():
    print('ind: ', ind)
    print('row: ', row)
    print('-'*20)
    
 
 ind:  1692
row:  성별                남자
연령대코드(5세단위)       50
신장(5cm단위)        170
수축기혈압          102.0
이완기혈압           69.0
Name: 1692, dtype: object
--------------------
ind:  3762511
row:  성별                남자
연령대코드(5세단위)       45
신장(5cm단위)        170
수축기혈압          123.0
이완기혈압           81.0
Name: 3762511, dtype: object
--------------------
ind:  668704
row:  성별                여자
연령대코드(5세단위)       65
신장(5cm단위)        150
수축기혈압          129.0
이완기혈압           79.0
Name: 668704, dtype: object
--------------------
ind:  1225411
row:  성별                남자
연령대코드(5세단위)       45
신장(5cm단위)        170
수축기혈압          121.0
이완기혈압           76.0
Name: 1225411, dtype: object
--------------------
ind:  4342771
row:  성별                여자
연령대코드(5세단위)       35
신장(5cm단위)        165
수축기혈압          123.0
이완기혈압           73.0
Name: 4342771, dtype: object
--------------------

인덱스와 해당하는 관측 시리즈를 같이 반환

 

2. apply()함수 : 내가 만든 함수(기능)을 돌려줌

import pandas as pd 
df_hc = pd.read_csv('data/국민건강보험공단_건강검진정보(샘플).csv', index_col=0).iloc[:,:5]
df_hc

 

인자와 반환값이 있는 사용자 정의 함수

def generation(x):
    if x < 90:
        return '저혈압'
    elif x < 140:
        return '정상'
    else:
        return '고혈압'

df_hc['혈압구분'] = df_hc['수축기혈압'].apply(generation) # 함수의 이름을 인자로 입력
df_hc

내가 바꾸고 싶은 시리즈를 가져와서 apply함수를 이용해서 함수 이름을 넣어줌

for문을 직접 쓸 필요없이 만들 수 있음

함수 이름을 그대로 변수처럼 가져와야 하기 때문에, ()괄호를 붙이면 안됨

return을 무조건 넣어주어야 함

 

이름없는 lambda함수를 apply()에 적용

df_hc['성별'] = df_hc['성별'].apply(lambda x : x[0])
df_hc

lambda 인자 : 함수 이름이 없음 (간단한 기능만 사용하는 함수).

: 뒤에 return 값이 옴

apply안에서만 쓰고 버릴 함수들 (남자, 여자를 앞문자만 따서 남,여로)

 

 

데이터프레임에 apply()에 적용

axis 인자 : 인덱스(0)와 컬럼(1)중에 어떤것이 반복될지 정해줘야 함

def generation(x):
    
    h = x['수축기혈압']
    l = x['이완기혈압']
    
    if h < 90 or l < 60:
        return '저혈압'
    elif h > 140 or l > 90:
        return '고혈압'
    else:
        return '정상'

sc = ['수축기혈압' ,'이완기혈압']
df_hc['혈압구분'] = df_hc[sc].apply(generation, axis = 1) # axis = 1: 컬럼축으로 가져옴
df_hc[df_hc['혈압구분'] == '고혈압']

 

axis=1 : 컬럼축으로 묶어서 apply 함수안에 넣어준다고 생각하기(반복)

return값을 하나로 만들어 줌 (저혈압/고혈압인지 처리해서 반환됨)

보통은 관측치를 기준으로 판단해서 axis=1로 사용함

 

3. 외부 통계함수 활용

scipy, numpy, sklearn등 외부 라이브러리의 다양한 통계 함수 또한 apply()에 적용가능

'데이터 분석 > Python - pandas' 카테고리의 다른 글

[실습] pandas 심화 2  (2) 2025.01.14
[실습] pandas 심화 1  (2) 2025.01.14
[이론] 문자열과 날짜형  (2) 2025.01.14
[이론] 연속형과 비연속  (2) 2025.01.14
[실습] 시각화 : 여러 그래프  (2) 2025.01.13