MCP - 14일차(Pandas - DataFrame)

Jun·2026년 2월 16일

MCP

목록 보기
19/20

데이터 분석의 핵심, DataFrame 완벽 가이드

1. DataFrame 개요

Pandas의 DataFrame은 2차원 테이블 형태의 데이터 구조입니다.
Excel의 Spreadsheet이나 SQL의 Table과 매우 유사하며, 데이터 분석 및 머신러닝에서 가장 많이 활용됩니다.
2차원이기 때문에 인덱스가 row, column로 구성됩니다.
row는 각 개별 데이터를, column은 개별 속성을 의미합니다. ('feature' 라고도 함)

  • Series: 1차원 배열 (Column 하나)
  • DataFrame: 2차원 배열 (Series의 집합)
  • Index: 행(Row)을 식별하는 고유 값
  • Column/Feature: 열(속성), 데이터의 특성을 의미

2. 환경 설정 및 데이터 로드

라이브러리 임포트

	import numpy as np
    import pandas as pd
    import os

데이터 불러오기 (Google Colab & CSV)

	from google.colab import drive
    drive.mount('/content/drive')

    base_path = r'/content/drive/MyDrive/dataset'
    filepath = os.path.join(base_path, 'titanic.csv') #여기서는 타이타닉 데이터 사용

    # CSV 파일을 DataFrame 객체로 읽기
    df = pd.read_csv(filepath)

출력 결과

PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
003Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
111Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
213Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
311Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
403Allen, Mr. William Henrymale35.0003734508.0500NaNS
....................................
88602Montvila, Rev. Juozasmale27.00021153613.0000NaNS
88711Graham, Miss. Margaret Edithfemale19.00011205330.0000B42S
88803Johnston, Miss. Catherine Helen "Carrie"femaleNaN12W./C. 660723.4500NaNS
88911Behr, Mr. Karl Howellmale26.00011136930.0000C148C
89003Dooley, Mr. Patrickmale32.0003703767.7500NaNQ

[891 rows x 12 columns]


컬럼 의미

# 컬럼 의미
# survived - Survival (0 = No; 1 = Yes)
# class - Passenger Class (1 = 1st; 2 = 2nd; 3 = 3rd)
# name - Name
# sex - Sex
# age - Age
# sibsp - Number of Siblings/Spouses Aboard
# parch - Number of Parents/Children Aboard
# ticket - Ticket Number
# fare - Passenger Fare
# cabin - Cabin
# embarked - Port of Embarkation (C = Cherbourg; Q = Queenstown; S = Southampton)
# boat - Lifeboat (if survived)
# body - Body number (if did not survive and body was recovered)


3. 데이터 파악 (EDA 기초)

데이터 미리보기

df.head()    # 상위 5개 행 출력 (기본값 5)
df.tail(7)   # 하위 7개 행 출력

데이터 정보 및 통계 확인

	# 1. shape: (행, 열) 크기 확인
    print(df.shape)  #(891,12)

    # 2. info(): 컬럼 타입, 결측치(Non-null) 개수 확인
    df.info()
    
    #출력 결과 
    <class 'pandas.core.frame.DataFrame'>
	RangeIndex: 891 entries, 0 to 890
	Data columns (total 12 columns):
	 #   Column       Non-Null Count  Dtype  
	---  ------       --------------  -----  
	0   PassengerId  891 non-null    int64  
	1   Survived     891 non-null    int64  
 	2   Pclass       891 non-null    int64  
 	3   Name         891 non-null    object 
 	4   Sex          891 non-null    object 
	5   Age          714 non-null    float64
 	6   SibSp        891 non-null    int64  
	7   Parch        891 non-null    int64  
 	8   Ticket       891 non-null    object 
 	9   Fare         891 non-null    float64
 	10  Cabin        204 non-null    object 
 	11  Embarked     889 non-null    object 
	dtypes: float64(2), int64(5), object(5)
	memory usage: 83.7+ KB
    
    

    # 3. describe(): 숫자형 데이터의 기술통계량 출력
    # 숫자형 데이터에 대해 기술통계량 정보
	# count, mean, std : 개수, 평균, 표준편차
	# max, min : 최대, 최소
	# 25%, 50%, 75%  : 하위 4분위 하위 2분위...

	df.describe()

4. DataFrame 생성 및 속성

리스트(List)로 생성

	df_list = pd.DataFrame([
        [1, 2, 3],
        [4, 5, 6]
    ], columns=['A', 'B', 'C'], index=['Row1', 'Row2'])
ABC
Row1123
Row2456

딕셔너리(Dict)로 생성

index= 없어도 생성됨! (기본 0-base index)

	data = {
        'Name': ['Alice', 'Bob', 'Charlie'],
        'Age': [25, 30, 35],
        'City': ['Seoul', 'Busan', 'Incheon']
    }
    df_dict = pd.DataFrame(data)
NameAgeCity
0Alice25Seoul
1Bob30Busan
2Charlie35Incheon

주요 속성들

	df.index    # 인덱스 정보
    df.columns  # 컬럼명 리스트
    df.dtypes   # 컬럼별 데이터 타입 (Series 형태로 반환)
    df.size     # 전체 요소(Element) 개수
    df.ndim     # 차원 (DataFrame은 항상 2)

5. 인덱스 및 컬럼 조작

이름 변경 (Rename)

    # 특정 컬럼명만 변경
    df2 = pd.DataFrame([
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12],
], columns = ['국어', '영어', '수학', '과학']

df2.index = ['고길동', '둘리', '마이콜']
국어영어수학과학
고길동1234
둘리5678
마이콜9101112
# 원본 변경 없다!  (inplace= 사용하면 변경됨)
df2.rename(columns={'국어':'kor', "과학":'Sci'})

인덱스 재설정 (Reset & Set)

  • (inplace= 사용하면 원본 변경됨)
	# 1. 기존 인덱스를 컬럼으로 보내고 새로운 숫자 인덱스 부여
    df2.reset_index(inplace=True)
index국어영어수학과학
0고길동1234
1둘리5678
2마이콜9101112
	# drop=True. 기존의 index 는 사라진다.
	df2.reset_index(drop=True)
국어영어수학과학
01234
15678
29101112

    # 2. 컬럼을 index 로 내리고,  기존의 인덱스를 대체한다.
    df2.set_index('국어')
국어
영어 수학 과학
1 2 3 4
5 6 7 8
9 10 11 12

퀴즈: 인덱스와 컬럼 스와이프

   # 퀴즈: df2 의 index 와 '국어' 컬럼을 바꾸려면?

원본(df2)

index국어영어수학과학
0고길동1234
1둘리5678
2마이콜9101112
df2.reset_index().set_index('국어')
국어 (index)index영어수학과학
1고길동234
5둘리678
9마이콜101112

6. 멀티 인덱스 (Multi-level Index)

복잡한 구조의 데이터를 표현할 때 사용합니다.

    pd.DataFrame({('k0', 'k1'): [10]})
k0
k1
0 10
	pd.DataFrame({('k0', 'k1'): {('a1', 'a2'): 10, ('b1', 'b2'): 40}})
k0
k1
a1 a2 10
b1 b2 40
df4 = pd.DataFrame(
   {
    ('k', 'k1') : [10, 20, 30, 31],
    ('k', 'k2') : [40, 50, 60, 61],
    ('j', 'j1') : [70, 80, 90, 91],
    ('j', 'j2') : [100, 110, 120, 121],
   },
   index = [['서울', '서울', '경기', '경기'], ['평일', '휴일', '평일', '휴일']]
)
k j
k1 k2 j1 j2
서울 평일 10 40 70 100
휴일 20 50 80 110
경기 평일 30 60 90 120
휴일 31 61 91 121

데이터프레임 선택 및 필터링

Pandas의 DataFrame에서 특정 컬럼, 로우(행), 그리고 조건에 맞는 데이터를 선택하는 방법들을 정리합니다.


1. 하나의 컬럼 선택

컬럼명을 직접 지정하거나 속성(Attribute) 방식을 사용할 수 있습니다.

  • df['Survived']: Series 형태로 반환

  • df.Survived: 속성 방식 (컬럼명에 공백이 없을 때 가능)

  • df.Age: 나이 컬럼 선택


2. 복수의 컬럼 선택하기

리스트 형태로 컬럼명을 전달하면 DataFrame 형태로 반환됩니다.

  • df[['Survived']]: 대괄호를 두 번 쓰면 결과는 DataFrame이다.

  • df[['Survived', 'Age', 'Name']]: 여러 컬럼을 한꺼번에 선택 가능하며, 순서 변경이나 중복 선택도 가능하다.


3. Row(행) 선택하기: loc[], iloc[]

DataFrame은 기본적으로 []를 컬럼 선택에 사용하므로, 행 선택을 위해서는 전용 속성이 필요합니다.

예제

IndexPassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
98688702Montvila, Rev. Juozasmale27.00021153613.00NaNS
98788811Graham, Miss. Margaret Edithfemale19.00011205330.00B42S
98888903Johnston, Miss. Catherine Helen "Carrie"femaleNaN12W./C. 660723.45NaNS
98989011Behr, Mr. Karl Howellmale26.00011136930.00C148C
99089103Dooley, Mr. Patrickmale32.0003703767.75NaNQ

3.1 loc (Label-based)

인덱스 자체(이름)를 사용하여 선택합니다.

  • df.loc[986]: 해당 인덱스의 데이터를 Series로 반환
IndexPassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
98688702Montvila, Rev. Juozasmale27.00021153613.0NaNS

  • df.loc[[986]]: 해당 인덱스의 데이터를 DataFrame으로 반환
IndexPassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
98688702Montvila, Rev. Juozasmale27.00021153613.0NaNS

* `df.loc[[986, 100, 110]]`: 여러 인덱스 동시 선택
IndexPassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
98688702Montvila, Rev. Juozasmale27.00021153613.00NaNS
100103Braund, Mr. Owen Harrismale22.010A/5 211717.25NaNS
1101113Sandstrom, Miss. Margueritefemale4.011PP 954916.70G6S
99089103Dooley, Mr. Patrickmale32.0003703767.75NaNQ

3.2 iloc (Integer-based)

0부터 시작하는 순서(Position)를 기준으로 선택합니다. (0 based index)

  • df.iloc[0]: 0번 인덱스가 아니라, '첫 번째' 행을 의미 (Series)
IndexPassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
100103Braund, Mr. Owen Harrismale22.010A/5 211717.25NaNS

  • df.iloc[[0, 100, 200, 2]]: 0, 100, 200, 2번째 행을 DataFrame으로 반환
IndexPassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
100103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
20010103Petranec, Miss. Matildafemale28.0003492457.8958NaNS
30020103Vande Walle, Mr. Nestor Cyrielmale28.0003457709.5000NaNS
102313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS

4. Row와 Column 동시에 선택하기

lociloc에 콤마(,)를 사용하여 행과 열을 동시에 지정할 수 있습니다.
예제

IndexPassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
98688702Montvila, Rev. Juozasmale27.00021153613.00NaNS
98788811Graham, Miss. Margaret Edithfemale19.00011205330.00B42S
98888903Johnston, Miss. Catherine Helen "Carrie"femaleNaN12W./C. 660723.45NaNS
98989011Behr, Mr. Karl Howellmale26.00011136930.00C148C
99089103Dooley, Mr. Patrickmale32.0003703767.75NaNQ
	#loc[row, column] <- loc[axis0, axis1]
	`df.loc[986, 'Survived']`: 특정 인덱스의 특정 컬럼 값 선택
    
    #출력 결과
    np.int64(0)
    
    
    df.iloc[-5, -3] # 뒤에서 5번째 행(986), 뒤에서 3번째 열(Fare) 선택
    
    #출력 결과
    np.float64(13.0)

예제2

IndexPassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
100103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
101211Cumings, Mrs. John Bradleyfemale38.010PC 1759971.2833C85C
102313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
103411Futrelle, Mrs. Jacques Heathfemale35.01011380353.1000C123S
104503Allen, Mr. William Henrymale35.0003734508.0500NaNS
	df.loc[102, 'Name']
    
	#출력 결과
    Heikkinen, Miss. Laina


	df.iloc[2, 3]
    
    #출력 결과
    Heikkinen, Miss. Laina  #동일하다!!!
  
  
  	df.loc[[986, 100, 110, 990], ['Survived', 'Name', 'Sex', 'Age']]
    #출력 결과
IndexSurvivedNameSexAge
9860Montvila, Rev. Juozasmale27.0
1000Braund, Mr. Owen Harrismale22.0
1101Sandstrom, Miss. Marguerite Rutfemale4.0
9900Dooley, Mr. Patrickmale32.0

참고: 체이닝(Chaining) 방식
df['Name'][102] 또는 df.loc[102]['Name'] 처럼 연속해서 인덱싱하는 것도 가능하지만,
가급적 loc[row, col] 방식을 권장합니다.


5. Boolean Selection으로 Row 선택하기

조건문(Mask)을 이용하여 특정 조건에 맞는 데이터만 추출합니다.

5.1 데이터 탐색 (Value Check)

Pclass는 객실의 등급입니다.

  • df.Pclass.unique(): 클래스의 종류 확인 (1, 2, 3)
# 출력 결과 : array([3, 1, 2])

  • df.Pclass.value_counts(): 클래스별 데이터 개수 확인
# 출력 결과 : 
PclassCount
3등급 (3)491명
1등급 (1)216명
2등급 (2)184명

5.2 조건 필터링 (Masking)

조건을 변수에 담아 가독성을 높일 수 있습니다.

    # 1등석 승객만 필터링
    pclass_mask = df['Pclass'] == 1
    df[pclass_mask]
    
    #출력 결과 :
IndexPassengerIdSurvivedPclassNameSexAgeFareCabinEmbarked
101211Cumings, Mrs. John Bradleyfemale38.071.2833C85C
103411Futrelle, Mrs. Jacques Heathfemale35.053.1000C123S
106701McCarthy, Mr. Timothy Jmale54.051.8625E46S
..............................
98989011Behr, Mr. Karl Howellmale26.030.0000C148C

    # 30대 승객 필터링
    age_mask = (df.Age >= 30) & (df.Age < 40)
    df[age_mask]
    
    #출력 결과 :
IndexPassengerIdSurvivedPclassNameSexAgeFareCabinEmbarked
101211Cumings, Mrs. John Bradleyfemale38.071.2833C85C
103411Futrelle, Mrs. Jacques Heathfemale35.053.1000C123S
104503Allen, Mr. William Henrymale35.08.0500NaNS
1131403Andersson, Mr. Anders Johanmale39.031.2750NaNS
1181903Vander Planke, Mrs. Juliusfemale31.018.0000NaNS
..............................
96786801Roebling, Mr. Washington Augustus IImale31.050.4958A24S
97287301Carlsson, Mr. Frans Olofmale33.05.0000B51 B53S
98188203Markun, Mr. Johannmale33.07.8958NaNS
98588603Rice, Mrs. William (Margaret Norton)female39.029.1250NaNQ
99089103Dooley, Mr. Patrickmale32.07.7500NaNQ

    # 다중 조건 (AND 연산자 '&' 사용)
    # 1등석이면서 30대인 승객
    df[pclass_mask & age_mask]
    
    #출력 결과 :
IndexPassengerIdSurvivedPclassNameSexAgeFareCabinEmbarked
101211Cumings, Mrs. John Bradleyfemale38.071.2833C85C
103411Futrelle, Mrs. Jacques Heathfemale35.053.1000C123S
1616211Icard, Miss. Ameliefemale38.080.0000B28NaN
23713801Futrelle, Mr. Jacques Heathmale37.053.1000C123S
31521611Newell, Miss. Madeleinefemale31.0113.2750D36C
..............................
77968011Cardeza, Mr. Thomas Drake Martinezmale36.0512.3292B51 B53C
90680701Andrews, Mr. Thomas Jrmale39.00.0000A36S
96786801Roebling, Mr. Washington Augustus IImale31.050.4958A24S
97287301Carlsson, Mr. Frans Olofmale33.05.0000B51 B53S

    # 다중 조건 (AND 연산자 '&' 사용)
    # 1등석이면서 30대인 승객의 클래스와 나이 컬럼만 확인
    df[pclass_mask & age_mask][['Pclass', 'Age']]
    
    #출력 결과 :
IndexPclassAge
101138.0
103135.0
161138.0
237137.0
315131.0
.........
935139.0
942130.0
967131.0
972133.0

퀴즈

	3등급 객실의 생존자 수는? 


	# 정답 코드
	pclass_mask = df['Pclass'] == 3
	Survived_mask = df['Survived'] == 1

	len(df[pclass_mask & Survived_mask])  #119
    

profile
Hard Trying

0개의 댓글