logoRawon_Log
홈블로그소개

Built with Next.js, Bun, Tailwind CSS and Shadcn/UI

AI

Pandas - 데이터 추출

Rawon
2025년 9월 16일
목차
Pandas란?
기본 구조
시리즈 객체
예시
데이터 프레임 객체
데이터 추출
데이터 호출
열 이름을 사용한 데이터 추출
행 번호를 사용한 데이터 추출
행과 열을 모두 사용한 데이터 추출
loc 함수

목차

Pandas란?
기본 구조
시리즈 객체
예시
데이터 프레임 객체
데이터 추출
데이터 호출
열 이름을 사용한 데이터 추출
행 번호를 사용한 데이터 추출
행과 열을 모두 사용한 데이터 추출
loc 함수

Pandas란?

pandas는 파이썬계의 엑셀이라고 불리며, 주로 데이터 분석 시 활용되는 라이브러리 입니다.

또한, 엑셀의 스프레드시트의 구조와 같은 데이터를 처리할 때 가장 쉽게 사용할 수 있는 파이썬 라이브러리입니다.

그래서 데이터 테이블을 다루기 위한 도구로 가장 적합합니다.

pandas는 데이터를 다루기 위해 numpy(파이썬에서 배열을 다루는 최적의 라이브러리)를 기본적으로 사용하며, numpy를 효율적으로 사용하기 위해 인덱싱, 연산, 전처리 등 다양한 함수를 제공합니다.

기본 구조

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-09-16_20.44.48.png

데이터프레임(DataFrame) : 데이터 테이블 전체 객체

시리즈 객체(Series) : 각 열 데이터를 다루는 객체

  • 리스트, 튜플, 넘파이 배열의 1차원 자료구조로 데이터 프레임의 한 행이나 열을 의미합니다.

용어가 생소하다보니 일반적인 DBMS 구조와 비교해서 이해하려고 노력해봤습니다.
데이터 프레임 - 테이블
시리즈 - 컬럼

시리즈 객체

feature vector와 같은 개념으로 일반적으로 하나의 피쳐 데이터를 포함하는 형태를 말합니다.

생성된 데이터프레임 안에 포함될 수 있으며 list, dict, ndarray 등 다양한 데이터 타입이 시리즈 객체 형태로 변환되기도 합니다.

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-09-16_20.49.31.png

위 그림과 같이 시리즈 객체를 생성하면 데이터(data), 인덱스(index), 데이터 타입(data type) 구조를 가집니다.

  • 데이터
    • 기존 다른 객체처럼 값을 저장하는 요소
  • 인덱스
    • 항상 0부터 시작하고, 숫자로만 할당하는 값
    • 숫자, 문자열, 0이외의 값으로 시작하는 숫자
    • 순서가 일정하지 않은 숫자를 입력할 수도 있음
    • 시리즈 객체에서는 인덱스 값의 중복을 허용
  • 데이터 타입
    • 넘파이의 데이터 타입과 일치함, pandas가 numpy의 wrapper 라이브러리이기 때문
    • 넘파이의 모든 기능을 지원하고 데이터 타입 또한 그대로 적용

예시

python
import pandas as pd  # pandas 모듈 호출
import numpy as np  # numpy 모듈 호출

# pandas.Series로 불러오는 대신 아래와 같이 불러오면 바로 Series, DataFrame을 호출할 수 있음.
from pandas import Series, DataFrame

list_data = [1,2,3,4,5]
list_name = ["a", "b", "c", "d", "e"]

example_obj = Series(data = list_data, index=list_name)
example_obj  # 결과 : 아래 그림 참조

example_obj.index  # Index(['a', 'b', 'c', 'd', 'e'], dtype='object')

# 데이터 값을 보기 위해서는 values를 사용
example_obj.values  # array([1, 2, 3, 4, 5])

# 실제 생성된 values는 numpy 배열 타입
type(example_obj.values)  # numpy.ndarray

# dtype은 데이터의 타입을 나타냄
example_obj.dtype  # dtype('int64')

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-09-16_20.57.45.png

시리즈 객체는 아래와 같이 객체의 이름을 변경할 수 있습니다. 위 예시코드에 이어서 작성해보겠습니다.

  • 열의 이름을 지정
  • 인덱스 이름 추가 지정
python
example_obj.name = "number"
example_obj.index.name = "id"
example_obj

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-09-16_21.04.15.png

이번에는 시리즈 객체를 생성하는 방법을 알아보겠습니다.

  • 데이터 프레임 객체를 먼저 생성하고 각 열에서 시리즈 객체를 뽑는 것이 일반적인 방법 입니다.
  • 또는 다양한 시퀀스형 데이터 타입으로 저장 가능합니다.
python
dict_data = {"a" : 1, "b" : 2, "c" : 3, "d" : 4, "e" : 5}
example_obj = Series(dict_data, dtype=np.float32, name="example_data")
example_obj

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-09-16_21.07.55.png

Pandas 의 모든 객체는 인덱스 값을 기준으로 생성됩니다.

  • 만약 기존 데이터에 인덱스 값을 추가하면 NaN 이 출력됩니다. (매칭 되는 데이터가 없으므로)
python
dict_data_1 = {"a" : 1, "b" : 2, "c" : 3, "d" : 4, "e" : 5}
indexes = ["a", "b", "c", "d", "e", "f", "g", "h"]
series_obj_1 = Series(dict_data_1, index=indexes)
series_obj_1

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-09-16_21.10.29.png

데이터 프레임 객체

데이터 프레임 객체는 데이터 테이블 전체를 지칭하는 객체 입니다.

시리즈의 묶음이기 때문에 Numpy 배열의 특성을 그대로 가지며, 각각의 열 별로 데이터 타입이 다를 수 있습니다.

그리고 열과 행을 각각 사용해서 하나의 데이터에 접근하는 인덱싱도 가능합니다.

데이터 프레임은 read_확장자 함수로 데이터를 바로 로딩하여 생성할 수 있습니다.

  • .csv나 .xlsx 등 스프레드시트형 확장자 파일에서 데이터를 로딩합니다.
python
# 데이터 URL을 변수 data_url에 할당
data_url = 'url'

# csv 데이터 로드
df_data = pd.read_csv(data_url, sep='\s+', header= None)

df = pd.DataFrame(df_data)
df

또는, 데이터 프레임을 직접 생성할 수도 있습니다.

  • 아래와 같이 딕셔너리 타입 데이터에서 키(key)는 열 이름, 값(value)은 시퀀스형 데이터 타입을 넣어 각 열의 데이터로 만듭니다.
python
from pandas import Series, DataFrame

raw_data = {'first_name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'],
'last_name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze'],
'age': [42, 52, 36, 24, 73],
'city': ['San Francisco', 'Baltimore', 'Miami', 'Douglas', 'Boston']}

df = pd.DataFrame(raw_data, columns = ['first_name', 'last_name', 'age', 'city'])
df

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-09-16_21.22.04.png

데이터를 생성할 때, 열의 이름을 한정하면 해당 열만 추출 할 수 있습니다.

만약 데이터가 존재하지 않는 열을 추가한다면 해당 열에는 NaN 값들이 출력되게 됩니다.

python
DataFrame(raw_data, columns = ["age", "city"])

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-09-16_21.31.24.png


데이터 추출

이번엔 .xlsx 형태 파일에서 데이터를 추출하는 몇가지 방법을 알아보겠습니다.

이에 앞서 openpyxl 모듈을 설치해야 합니다.

아래 코드는 주피터 노트북에서 패키지를 설치하는 코드입니다. (colab에서도 동작하는지는 모르겠습니다..)

python
# 콘솔 명령어는 앞에 ! 를 붙여 실행시켜야 합니다.
!conda install --y openpyxl

데이터 호출

  • read_excel 함수로 엑셀 데이터 호출
python
import pandas as pd
import numpy as np

# 로컬 PC에서 데이터 파일을 업로드 하는 방법
# goole.colab으로 부터 files 패키지를 import한다.
from google.colab import files

#파일 업로드 기능 실행
uploaded = files.upload() 
df = pd.read_excel("excel-sample-data.xlsx")

열 이름을 사용한 데이터 추출

  • head 와 tail 함수 : 처음 n개 행이나 마지막 n개 행 호출
python
df.head(5)

df.head(3).T

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-09-16_21.38.54.png

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-09-16_21.39.08.png

  • 이외에 가장 일반적인 호출 방법은 “열 이름을 리스트 형태로 넣어 호출” 하는 방법입니다.
    • 문자형 열 이름을 하나만 넣으면 값이 시리즈 객체로 반환되며
    • 열 이름을 여러 개 넣으면 데이터 프레임 객체로 반환됩니다.
python
df[["account", "street", "state"]].head(3)

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-09-16_21.43.29.png

행 번호를 사용한 데이터 추출

  • 인덱스 번호로 호출
    • 기존의 리스트나 넘파이 배열 인덱싱과 동일합니다.
python
df[:3]

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-09-16_21.44.24.png

행과 열을 모두 사용한 데이터 추출

  • 위의 두가지 방법(열 이름, 행 번호)이 함께 사용 됩니다.
  • 데이터의 일정 부분을 사각형으로 잘라낸 것과 같은 형태의 결과를 반환합니다.
python
df[["name","street"]][:2]

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-09-16_21.45.35.png

loc 함수

인덱스 이름과 열 이름으로 데이터를 추출하는 함수 입니다.

일반적으로 인덱스의 초기값은 0이나 필요에 따라서는 인덱스의 값을 변경할 수 있습니다.

아래 코드는 기존 index를 지우고 account 값을 인덱스로 지정하는 코드입니다.

python
df.index = df["account"]
del df["account"]
df

그래서 인덱스 대신 특정 account 번호를 넣어서 loc 함수를 호출하고 원하는 데이터를 호출할 수 있습니다.

python
df.loc[[211829,320563],["name","street"]]

df.loc[205217:,["name","street"]]

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-09-16_21.49.18.png

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-09-16_21.49.33.png

이때, 인덱스 번호가 항상 정렬되어 있지 않아 처음 저장된 순서대로 출력됩니다.