Notice
Recent Posts
Recent Comments
Link
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

Elevation

ML 기초 (2) - pandas 본문

ML, DL

ML 기초 (2) - pandas

aste999 2026. 2. 2. 15:18

파이썬 라이브러리 pandas는 패널 데이터(Panel Data)에서 이름을 따온 것으로, 엑셀처럼 표 형식의 데이터에 대해 다양한 작업을 수행할 수 있게 해준다. 대량의 데이터가 표 형식으로 주어지는 경우가 많은 ML 프로젝트에서 pandas의 능숙한 활용은 필수적이라고 볼 수 있다. pandas의 핵심 기능들에 대해 간단히 알아보자.

 

 

자료구조: DataFrame과 Series

pandas에서는 표 형식의 데이터를 담기 위해 DataFrame이라는 자료형을 이용한다. dict, ndarray, Series 등을 DataFrame으로 만드는 것이 가능하다.

 

import pandas as pd
import numpy as np

df = pd.DataFrame({'column1':[1,2], 'column2':[3,4], 'column3':[5,6]})
df2 = pd.DataFrame(np.array([[1,2,3], [4,5,6]]))
df3 = pd.DataFrame(pd.Sereis({'a':'1', 'b':'2', 'c':'3'}))

 

dict로부터 만들어진 DataFrame인 df의 경우, 세로줄은 column명이 지정되어 있고, 가로줄은 index를 따로 지정하지 않았으므로 자동으로 0부터 시작하는 번호가 붙어져 있다. df의 가로줄은 0번 축(axis=0), 세로줄은 1번 축(axis=1)이 된다.

 

Series는 한 줄의 데이터를 담는 자료형이다. 파이썬의 기본 자료형인 list와 비슷하지만, index와 name을 따로 지정해줄 수 있다. Series는 DataFrame의 하위 자료형으로, DataFrame의 각 열은 하나의 Series가 된다(DataFrame의 column명이 Series의 name으로 들어가게 된다). DataFrame의 각 열들에 접근하고 싶은 경우, df.column1과 같이 하위 객체로 보고 접근하거나, dict 자료형처럼 대괄호([]) 안에 column명을 넣어 접근할 수 있다.

 

s = pd.Series(["a", "b", "c"], name="series_name")

s1 = df.column1
s2 = df["column2"]

 

 

데이터 로드 및 접근

ML 프로젝트에 필요한 데이터셋은 보통 csv 파일이나 excel 파일로 주어진다. pandas에서는 pd.read_csv()를 통해 csv 데이터셋을 DataFrame으로 불러올 수 있다. 매우 유명한 데이터셋인 Titanic Dataset(https://www.kaggle.com/c/titanic/data?select=train.csv)을 로드해 보자.

df = pd.read_csv("train.csv")
df

 

 

DataFrame의 특정 데이터에 접근해 값을 확인해 보자. df.loc, df.iloc을 활용하는 것이 가장 직관적이다. loc은 주어진 index명과 column명을 바탕으로, iloc은 index 및 column 위치를 바탕으로 DataFrame 내 값을 가져온다. 조건을 두지 않고 모든 데이터를 가져오고 싶은 경우(wildcard), 콜론(:)을 사용한다. drop() 등 DataFrame의 메소드들과 달리 대괄호를 사용함에 유의하라.

df.loc[3, "Name"]
df.iloc[:, ::2]

 

 

다른 방법도 살펴보자. df[0]으로 첫 번째 행을 가져오는 것이 가능할까? 안타깝게도 이 방식은 column명으로 열을 불러올 때 이용했던 방식이므로, df[0]은 이름이 0인 column이 있는지 살펴보고 없다면 KeyError를 반환할 것이다. 다만 슬라이싱은 행을 선택하는 것으로 인식하여, 정상적으로 작동한다. 즉 0번 행의 데이터를 불러오고 싶다면 df[0:1]과 같이 사용해야 한다.

 

한편 특정 열들만을 선택해 새 DataFrame을 만드는 경우, 대괄호 안에 열 이름 대신 열 이름들의 list를 넣어 df[["Pclass, "Sex"]]와 같이 간단하게 구현할 수 있다.

 

필터링, 즉 특정 조건을 만족하는 데이터를 불러오는 방법은 다음과 같다. df['Pclass'] == 1과 같이 조건식을 만들면, 조건의 만족 여부에 따라 True/False가 저장된 Series가 반환된다. DataFrame은 boolean 배열을 이용한 selecting을 지원하므로, df[df['Pclass' == 1]]과 같이 쓰면 Pclass가 1인 행만을 불러올 수 있다. 논리 연산자의 사용 역시 가능하다.

cond1 = df['Age'] > 60
cond2 = df['Pclass'] == 1
cond3 = df['Sex'] == 'female'
df2 = df[cond1 & cond2 & cond3]
df2 = df2[["Name", "Age", "Pclass", "Sex"]]

 

 

데이터 편집

데이터 추가에 대해 살펴보자. 열을 추가하고 싶은 경우, dict처럼 df["new"] = 0과 같이 쓰면 이름이 new이고 모든 행에 대해 값이 0인 새 열이 df에 추가된다. 사칙연산이 가능하므로, df["Age_10"] = df["Age"] * 10처럼 필요에 따라 기존 열의 값을 변환하여 새로운 열을 만들 수 있다. 행을 추가하고 싶다면, df.append()로 마지막 행을 추가하거나, pd.concat()을 이용해 특정 위치에 행을 추가할 수 있다.

 

여러 개의 DataFrame(이나 Series)를 합치는 경우, pd.concat(), pd.merge() 등을 활용한다. 합치는 방식에 따라 옵션을 잘 설정해야 한다(https://suy379.tistory.com/127를 참고).

 

데이터 삭제는 df.drop()으로 한다. column명이나 index명으로 대상을 지정하고, axis 파라미터를 통해 행을 삭제할 것인지, 열을 삭제할 것인지 지정한다. drop()에는 inplace 파라미터가 있는데, inplace=False일 경우 원래 DataFrame은 그대로 두고 데이터를 삭제한 새 DataFrame을 반환하나, inpalce=True로 놓게 되면 원래 DataFrame에 접근해 수정하고 None을 반환한다. 따라서 df=df.drop(~~, inplace=True)와 같이 작성하면, df 내에 원래 담겨 있던 데이터가 다 날라가 버리게 될 것이므로 주의해야 한다(ML 프로젝트에서는 데이터 처리에 시간이 꽤 걸리기 때문에, 특히 colab 등에서 실시간 작업을 하는 경우 데이터 처리를 처음부터 다시 하는 것은 상당한 스트레스일 것이다).

 

df_dropped = df.drop([0,1,2], axis=0, inplace=False)

 

 

자주 사용하는 기능의 경우 코드가 어느 정도 외워지지만, 복잡한 데이터 편집이 필요한 경우나 세부적인 파라미터의 옵션까지 머리 속에 담아두기는 쉽지 않을 것이다. 검색이나 LLM의 도움을 적극적으로 활용하는 것 또한 효율적인 ML 프로젝트 작업을 가능하게 해 주는 역량이라고 생각한다.

'ML, DL' 카테고리의 다른 글

ML 기초 (3) - pandas 2편  (0) 2026.02.03
ML 기초 (1) - ML 프로젝트  (0) 2025.05.24