파이썬

0707 Pandas

인뽕 2026. 7. 9. 00:25

 

 

Pandas

 

- 파이썬에서 표(테이블) 형태의 데이터를 다루기 위한 라이브러리이다.

Pandas에서 가장 알아야 할 것은 Seriese, DataFrame이라는 자료구조이다. 1차원 데이터를 다루는 데 효과적인 Seriese와 2차원 데이터를 다루는 데 효과적인DataFrame을 활용하여 파이썬만으로는 할 수 없었던 데이터 정제, 데이터 가공, 데이터 요약 및

분석을 할 수 있다.

 


 

#지정한 문자열 인덱스로 데이터 접근 

 

kakao2 = Series([92600,92400,92100,94300,92300],
                index=['2016-02-19',
                       '2016-02-18',
                       '2016-02-17',
                       '2016-02-16',
                       '2016-02-15'])

print(kakao2['2016-02-19'])

 

시리즈를 생성할때 지정한 인덱스(2016-02-19)를 통해 데이터에 접근한다.


 

# 딕셔너리를 사용한 기본 DataFrame 생성

# 칼럼 선택을 통해 각 Series 객체에 접근

raw_data = {'col0': [1,2,3,4],
            'col1': [10,20,30,40],
            'col2': [100,200,300,400],}


# 칼럼 선택을 통해 각 Series 객체에 접근
data = DataFrame(raw_data)
data['col1']
print(data['col0'])
print(type(data['col0']))

 

key:string value : list(int)

인 딕셔너리 raw_data를 사용해서 data라는 DataFrame을 만든다.

key값이었던 문자열들이 칼럼이 되어 data['col1']처럼 칼럼 선택을 통해 각 Series 객체에 접근한다.

 


#인덱스 순서가 서로 다른 두 개의 Series 생성

mine = Series([10,20,30],index=['naver','sk','kt'])
friend = Series([10,30,20],index=['kt','naver','sk'])

merge = mine + friend

 

인덱스의 구성이 같은 두 시리즈를 더하면 각 인덱스에 해당하는 값끼리 더해진 시리즈가 된다.

 


 

#주가 데이터(OHLC) DataFrame 생성 (칼럼 순서 및 인덱스 지정)

 

#주가 데이터(OHLC) DataFrame 생성 (칼럼 순서 및 인덱스 지정)
daeshin = {'open': [11650,11100,11200,11100,11000],
           'high': [12100,11800,11200,11100,11150],
           'low': [11600,11500,10900,10950,10900],
           'close': [11900,11600,11000,11100,11050]
           }

대신증권의 시가, 고가, 저가, 종가 문자열을 키, 가격을 값으로 갖는 딕셔너리를 정의한다.


# columns로 칼럼 순서를 정렬하고,
# index로 날짜를 지정하여 생성

 

daeshin_day = DataFrame(daeshin,
                        columns=['open', 'low', 'high','close'])

# index로 날짜를 지정하여 생성
date = ['16.02.29', '16.02.26', '16.02.25', 
        '16.02.24', '16.02.23']
daeshin_day = DataFrame(daeshin,
                        columns=['open',
                                 'high',
                                 'low',
                                 'close'],
                        index=date)

 

앞서 정의한 daeshin 딕셔너리와 다시 정의한 칼럼 순서, 리스트로 정의한 날짜 date를 인덱스로 만들어 DataFrame()에 전달해 데이터프레임을 만든다.


# 칼럼 선택 (종가 데이터 선택)

close = daeshin_day['close']
print(close)

데이터프레임 daeshin_day에서 'close' 칼럼의 정보를 날짜별로 모아놓은 close라는 시리즈를 만든다.

출력 결과


# 로우 선택

# (기존 ix 대신 loc 메서드를 사용하여 특정 날짜 행 선택)
print(daeshin_day.loc['16.02.24'])

 

close와 달리 인덱스를 사용해 해당 날짜의 시가, 고가, 저가, 종가를 출력한다.

출력 결과


# 방법 A : .loc[행, 열] 구조로 정확하게 짚기

print(daeshin_day.loc['16.02.24', 'close'])

 

데이터프레임 daeshin_day에서 '16.02.24' 행 'close'열을 출력한다.

출력결과

# 방법 B: 이미 뽑아둔 close  시리즈에서 날짜로 조회하기

print(close['16.02.24'])

미리 정의한 close 시리즈에 인덱스를 넣어 출력한다.

출력결과

 


#CSV 파일 불러오기

import pandas as pd

df = pd.read_csv('./data/csv/medical.csv')

 

pandas를 import 해주고 read_csv 함수를 호출 해 medical.csv 파일을 읽어와 데이터프레임으로 만든다.

(필요시 인코딩방식 명시)


# 데이터의 상위 , 하위 5개 행 확인

print(df.head())
print(df.tail())

데이터프레임의 상위 , 하위 5개 행을 출력한다.

출력 결과


#데이터의 기본 정보 (행/열 개수, 데이터 타입, 결측치 유무) 확인

# 기술 통계량(평균, 최댓값, 최솟값 등 ) 요약 확인

print(df.info())
print(df.describe())

데이터의 행/열 개수, 데이터 타입, 결측치 유무를 확일 할 수 있는 info() 함수, 기술 통계량(평균, 최댓값, 최솟값 등 ) 요약을 확인할 수 있는 describe() 함수이다. 추가로 각 컬럼별 결측치의 개수를 확인 할 수 있는 함수를 isnull().sum()이라고한다. 위 함수들은

데이터 정제 과정에서 꼭 필요한 함수들이다.


# 'Age' 컬럼이 60 이상인 데이터만 필터링

 

senior_patients = df[df['Age']>=60]

Age 컬럼의 열 데이터 중 60이상인데이터만 필터링 하여 senior_patients(dtype : Series)에 저장한다.   


# 여러 조건 결합 (나이가 60세 이상이면서 'NO_SHOW'가 'Yes'인 환자)

no_show_seniors =df[(df['Age']>=60)&(df['No-show']=='Yes')]

논리연산자 &를 사용하여 Age가 60 이상, No-show가 Yes인 데이터만 필터링하여 no_show_seniors( dtype : Series )에

저장한다. 


결측치 처리 방법

 

# 방법 A : 결측치가 포함된 행을 모두 삭제하기

df_cleaned =df.dropna()


# 방법 B : 결측치를 특정 값(예: 0 또는 평균값)으로 채우기

df_filled =df.fillna(0)
df['Age'] = df["Age"].fillna(df['Age'].mean())

### 4. 데이터 그룹화 및 집계 (groupby)####

 


# 'No-show'(노쇼 여부)별로 'Age'(나이)의 평균 계산하기

age_by_noshow = df.groupby('No-show')['Age'].mean()

age_by_noshow는 노쇼 여부별로 Age의 평균값을 데이터로 갖는 시리즈이다.

 

# 여러 컬럼을 기준으로 집계 (성별과 노쇼 여부별 환자 수 카운트)

grouped_count = df.groupby(['Gender', 'No-show']).size()
print(grouped_count.index)

grouped_count는 df에서 Gender, No-show의 종류 (여기서는 개수는 2*2) 별로 환자수를 센다.

 

# 'Age' 컬럼을 기준으로 내림차순 정렬 (나이가)

df_sorted = df.sort_values(by='Age', ascending =False)

df에서 Age칼럼의값을 기준으로 내림차순 정렬한다. ascending=True면 오름차순.

 

# 'No-show' 컬럼에 어떤 값이 각각 몇개씩 들어있는지 확인

print(df['No-show'].value_counts())

비율이나 빈도 파악에 유용하다.


#가장 첫 번째 행(0번행) 데이터 가져오기

first_row =df.iloc[0]

df의 0번 행을 저장한다.

 

# 처음 5개 행과 처음 3개 열 슬라이싱 하기

subset = df.iloc[0:5, 0:3]

0~4번째 행, 0~2번째 열 정보를 subset에 저장한다. (5행3열)


##### Pandas pivot_table 사용법 #####
index: 세로 행에 배치할 기준
columns: 가로 열에 배치할 기준
values: 표 안에 채워 넣을 데이터(계산 대상)

aggfunc: 데이터의 대상 함수

 


# 예시 1: 성별(Gender)과 노쇼 여부(No-show)에 따른 평균 나이 (Age)
# 세로(index): 성별(Gender)
# 가로(columns): 노쇼 여부 (No-show)

# 값(values): 나이 (Age)의 평균

pivot_age = df.pivot_table(index='Gender',
                           columns='No-show',
                           values='Age',
                           aggfunc='mean')

인덱스를 'Gender'의 종류 (M,F), 칼럼을 'No-show'의 종류 (Yes, No), 데이터는 Age의 평균을 갖는 데이터프레임을 만든다.

pivot_age 형태



# 성별 및 노쇼 여부별 환자 수 카운트
# margins 인자 추가시 가로/세로 총합 추가

pivot_gender_no_show = df.pivot_table(index='Gender',
                           columns='No-show',
                           values='PatientId',
                           aggfunc='count',
                           margins=True)

Gender,Noshow 별 환자의 수를 구한다. 

pivot_gender_no_show 형태



#Pandas에는 df.pivot()과 df.pivot_table()

df.pivot(): 데이터에 중복된 행이 없을 때
df.pivot_table(): 병원 데이터처럼 중복된  항목(같은 성별, 같은 노쇼 등)
이 많아서 그룹화 하고 요약 통계(평균, 합계 등)

데이터 분석에서는 90% 이상 pivot_table을 사용


### 두 개 이상의 데이터프레임 병합하기 (merge)

### 두 개 이상의 데이터프레임 병합하기 (merge)
# 예시 데이터프레임 1: 진료 기록
df_medical = pd.DataFrame({
    'PatientId': [101, 102, 103],
    'No-show':['No','Yes','No']
    })

# 예시 데이터프레임 2: 환자 주소 정보
df_info = pd.DataFrame({
    'PatientId' : [101,102,104],
    'Neighborhood' : ['Jardim', 'Maria', 'Centro']
    })

# PatientId를 기준으로 두 데이터 프레임 병합
df_merged = pd.merge(df_medical, df_info,
                     on='PatientId',
                     how='outer')
'''
1. how= 'inner' (기본값)
2. how='left'
3. how ='right'
4. how = 'outer'
'''

 

임의의 데이터프레임 df_medical(인덱스는 지정하지 않았으므로 기본인덱스0,1,2, 칼럼은 PatientId,No-show )과

df_info( 인덱스는 지정하지 않았으므로 기본인덱스0,1,2, 칼럼은 PatientId, Neighborhood)

두 데이터프레임이 공유하는 칼럼 PatientId를 활용하여 데이터프레임을 병합한다.

마지막인자 how에 따라 어떤 데이터프레임의 PatientId값을 기준으로 병합할지 결정된다.

inner 선택시 두 데이터프레임의 교집합인 PatientId를 기준으로 병합되므로 새로운 결측치가 발생하지 않고,

outer 선택시 두 데이터프레임의 합집합인 PatientId를 기준으로 병합되므로 새로운 결측치가 발생할 수 있다. 


###날짜 데이터 형식 변환(to_datetime) ###

# 'AppointmentDay' 컬럼을 문자열에서 날짜 형식으로 변환
df['AppointmentDay'] = pd.to_datetime(df['AppointmentDay'])
df['ScheduledDay'] = pd.to_datetime(df['ScheduledDay'])

#2. 접수 후 예약일까지 며칠이나 걸렸는지 대기 기간 계산
df['Waiting_Days'] = (df['AppointmentDay'] - df['ScheduledDay']).dt.days

 

예약일과 진료예정일 데이터를 문자열에서 날짜 형식으로변환한 뒤, (진료예정일 - 예약일)로 접수 후 예약일까지 대기기간을 계산하여 칼럼으로 추가한다.


### Pandas 데이터 분석 ###
'''
1. 데이터 로드 및 확인: read_csv(), head(), info()
2. 데이터 정제: 결측치 처리(dropna(), fillna()), 날짜 변환(to_datetime())
3. 데이터 가공: 파생 변수 생성(apply()), 데이터 병합(merge())
4. 데이터 요약 및 분석: groupby(), pivot_table(), value_counts()
'''


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'파이썬' 카테고리의 다른 글

0713 ML/DL  (0) 2026.07.13
0710 Numpy  (0) 2026.07.10
0709 파이썬 기초 문법 복습  (0) 2026.07.09
0708 데이터 분석 및 시각화  (0) 2026.07.09
0706 Class  (0) 2026.07.08