데이터분석

[데이터 분석] Pandas의 여러가지 기능 1(csv파일, 데이터프레임 구조, loc)

sdesign416 2026. 6. 5. 08:35
 

[데이터 분석] Pandas 기초 정리

판다스(Pandas)는 Python에서 데이터를 쉽고 효율적으로 분석하기 위해데이터 분석을 할 때 사용되는 라이브러리이다. 쉽게 생각하면 파이썬으로 작동하는 엑셀이라 보면 되지만프로그램(파일)이

sdesign416.tistory.com


CSV 파일

CSV파일은 Comma-Separated Values(쉼표로 구분된 값)으로

데이터를 단순하게 텍스트 형식으로 저장하는데에 사용되는 파일 형식이다.

 

CSV파일은 호환성이 좋고, 구조가 단순하여

파일이 차지하는 용량이 작고 속도가 빠르다.

※ 보통 맨 윗줄은 컬럼(제목)이고 그 다음 아랫줄부터 데이터로 표기된다.


CSV 파일 불러오기

광고모델_브랜드평판.csv
0.00MB

 

'광고모델_브랜드평판.CSV'파일을 불러와 사용할 예정이다.

 

해당 파일을 다운받은 후 작업공간에 넣어주고

코드셀에서 아래 코드로 CSV를 실행시켜주면 된다.

# CSV를 메모리로 가져옴 (read_csv 메서드 사용하여 df변수에 생성)
df = pd.read_csv('./광고모델_브랜드평판.csv')

# 잘 가지고왔는지 출력해보기
print(df)

※ Pandas가 실행되어있지 않다면 실행시켜 주어야 한다!

    실행 코드 : import pandas as pd


CSV 파일 살펴보기

1) 변수에 생성된 CSV파일의 데이터 타입 출력하기

type(df)

# 출력결과 : 
# pandas.DataFrame

 

2) 행 인덱스 확인

print(df.index)

# 출력결과 : 
# Index(['김사과', '반하나', '오렌지', '이메론', '배애리'], dtype='str')

 

3) 열 이름 확인

print(df.columns)

# 출력결과 : 
# Index(['국어', '영어', '수학'], dtype='str')

 

4) 데이터 값 확인

print(df.values)

# 출력결과 :
# [[67 93 91]
#  [75 68 96]
#  [87 81 82]
#  [62 70 75]
#  [98 56 87]]

 

5) 데이터 프레임 상세 명세서 출력

df.info()

실행결과 ▶

  • <class 'pandas.DataFrame'>
  • RangeIndex : 데이터가 얼마나 들어있는지?
  • 컬럼이 몇개있는지?
  • 컬럼에 대한 설명
    • Non-Null Count = 컬럼에 안들어간게 있나요?
    • 혈액형은 2개가 데이터값이 없어서 내역출력에서 18 non-null이라 나타남
  • 내역출력
  • dtypes : 컬럼데이터타입과 개수
  • memory usege : 현재 메모리 얼마나 차지하는지? 

데이터프레임 구조 확인하기

데이터 프레임은 Index, Column, Data 3가지 요소로 구성되어 있다.

 

파이썬의 특징상 데이터프레임 뒤에 점(.)을 붙여 세부 요소에 접근할 수 있다.

# 변수명.속성

df.columns

# 출력결과 : 
# Index(['이름', '소속사', '성별', '생년월일', '키', '혈액형', '브랜드평판지수'], dtype='str')

 


컬럼 변경하기

컬럼을 출력해보면 데이터들이 통째로 묶여있어,

컬럼 하나하나 컨트롤이 어려운 구조인것이 확인된다.

 

그래서 컬럼을 변경하고 싶을땐 전체로 덮어써서 변경해주어야 한다.

# 바꿀 컬럼 리스트 통째로 준비
new_columns = ['name', 'company', 'gender', 'birthday', 'height', 'blood', 'brand']

# 기존 컬럼에 새로운 컬럼 덮어씀
df.columns = new_columns

# 출력하여 확인
df

실행결과 ▶


통계 정보 반환하기 (describe)

describe()는 컬럼에 대한 통계 정보를 반환해주는 함수로

기본값은 숫자를 반환하는것이다.

df.describe()

숫자와 문자가 섞여있는 데이터프레임의 경우

숫자에 대한 통계정보만 보여주게된다.

 

이때 문자열 커럶에 대한 통계 정보를 반환하기 위해선

include=str을 사용해주면 된다.

df.describe(include=str)

실행결과 ▶

항목 의미 설명
count 데이터 개수 (코드기준) 문자열 데이터가 몇개있는지?
unique 고유값 개수 중복을 제외한 서로 다른 값 개수
top 가장 많이 나온 값 최빈값(가장 많이 등장한 횟수의 데이터 중 가장 높은 값)
freq top의 등장 횟수 가장 많이 나온 값이 몇 번 등장했는지

※ top : name, birthday와 같은 겹치는 값 없이, 모든 값이 unique이면 첫 번째 행의 값을 반환한다.


원하는 개수 데이터 보기

기본값은 5개이며

괄호안에 숫자를 입력하여 보고싶은 데이터 갯수만큼 출력할 수 있다.

# 상위 5개 행(row) 출력
df.head()

# 하위 5개 행(row) 출력
df.tail()

정렬하기

정렬하기는 따로 변수에 저장하지 않으면 원본값이 바뀌지않는다.


기본 정렬

index(번호)로 정렬이 가능하며, 기본값은 오름차순이다.

내림차순 정렬이 필요 할 경우 괄호안에 ascending=False를 추가해 사용할 수 있다.

# 오름차순 정렬
df.sort_index()

# 내림차순 정렬
df.sort_index(ascending=False)

특정 컬럼으로 정렬

고유한 index가 아닌 특정 컬럼으로 정렬을 하고싶을 때

괄호안에 by='컬럼명'을 넣어 사용할 수 있다.

df.sort_values(by='height')

실행결과 ▶

 

하지만 위 실행결과를 보면 오류가 있는것이 확인된다.

얼핏보기엔 정렬이 잘 된 것 처럼 보이지만

182.2cm같은 소수점이 붙은 데이터가 정렬오류가 생기는것이 확인된다.

 

📌왜 이런 결과가 나타날까?

height의 데이터타입은 문자열이기에 ASCII코드로 비교를 하게 된다.

ASCII코드에서 소문자 c : 99번, 마침표 기호(.) : 46번으로

182.2cm의 마침표기호 46번과 182cm의 c 99번을 비교하게 되기 때문이다.

 

💡어떻게 수정해야할까?

문자열로 비교하는것이 아닌 숫자형으로 변환을 해야한다.

숫자형으로 변환하기 위해선 cm 문자열을 제거한 뒤 float 형태로 변환하면 된다.

# [순서1]
# : str에 replace(치환)를 사용해서 cm를 없앰
df['height'] = df['height'].str.replace('cm', '').astype(float)

# height의 datatype이 float으로 변경된것 확인!
df.info()

실행결과 ▶

# 순서2
# : 다시 키(height)컬럼을 정렬
df.sort_values(by='height')

 

실행결과 ▶


2차 정렬

데이터가 많은 경우 정렬을 해도 동일한 데이터 값을 가지는 데이터들을

확실히 구분하기 위해 2차정렬을 사용할 수 있다.

# 1차 정렬 : 키(내림차순)
# 2차 정렬 : 브랜드(내림차순)
df.sort_values(by=['height', 'brand'], ascending=[False, False], na_position='first')

※ 비교를 위해 brand컬럼 int로 치환! (df['brand'] = df['brand'].str.replace(',','').astype(int))

실행결과 ▶


인덱싱과 슬라이싱

데이터프레임은 단순히 전체를 보는것만 제공하지 않고

원하는 컬럼이나 특정 조건의 데이터만 선택하여 다룰수도 있다.


기본 인덱싱

데이터프레임의 위에서부터 또는 아래에서부터 원하는 행만큼 출력할 수 있다.

또한 괄호안에 숫자를 넣으면 원하는 행 만큼 출력이 가능하며,

기본값은 5로 설정되어 있다.

# 위에서부터 5개 행 출력
df.head()

실행결과 ▶

# 위에서부터 5개 행 출력
df.head()

# 아래에서부터 5개 행 출력
df.tail()

실행결과 ▶


컬럼 선택하여 인덱싱

특정 컬럼을 하나를 선택할때는 대괄호 또는 점(.)기호를 사용할 수 있다.

하지만 점(.)기호의 경우 공백이나 특수문자가 있는경우 사용할 수 없다는점을 주의해야한다!

# 방법1
df['blood']

# 방법2
df.blood

※ 대괄호가 가장 안전한 방식이다.

실행결과 ▶


슬라이싱

기본적으로 데이터프레임을 슬라이싱하여 가져올수도 있다.

아래 두 코드는 동일한 결과를 출력한다.

# 인덱싱으로 위에서부터 3개 행 가져오기
df.head(3)

# 위 방법을 슬라이싱으로 행 가져오기
df[:3]

실행결과 ▶

 

하지만 인덱스 이름이 항상 숫자로 되어있지는 않다.

 

그렇게 때문에 loc를 함께 활용할 수 있는데,

loc는 데이터프레임(DataFrame)이나 시리즈(Series)에서 

이름(Label)과 컬럼명을 기준으로 데이터를 선택하는 인덱서(Indexer)이다.

 

쉽게 말해, 숫자 위치가 아닌 

실제 행 이름과 열 이름을 사용하여 데이터를 뽑아내는 방식인것이다.

 

예제1)

# 행은 다 가져오고(:), 열은 name값만 가져와
df.loc[:, 'name'] 	# df['name']와 같은 출력값을 가진다.

실행결과 ▶


예제 2)

# 행은 2번부터 5번까지 슬라이싱
# 열은 name, gender, height를 리스트로 묶어 인덱싱(여러개이기 때문에)
df.loc[2:5, ['name', 'gender', 'height']]

실행결과 ▶


예제 3)

# 행은 2, 5번 리스트로 묶어 슬라이싱
# 열은 name, gender 인덱싱
df.loc[[2,5], ['name', 'gender', 'height']]

실행결과 ▶


💡.iloc와 .loc의 차이!

.iloc를 사용하면 우리가 흔히 생각하는 슬라이싱 방법이지만

.loc는 조금 다르다.

 

.loc는 '숫자 위치'가 아니라 '눈에 보이는 이름(레이블)' 기준이기 때문에

우리가 5페이지까지 읽어라 라고 하면 

기존에 5페이지 직전인 4페이지까지만 출력하는 것이 아닌

5페이지를 포함하여 출력하게 된다.

  • df.iloc[2:5] → 5번행 포함하여 출력(이름 기준) : 2,3,4,5 출력
  • df.loc[2:5] → 2부터 5번직전까지 출력(숫자 위치) : 2,3,4 출력

조건 활용 인덱싱 (bool)

조건을 이용하여 원하는 데이터만을 추출할수도 있다.

 

1) 기본 조건

# height 시리즈가 180보다 크거나 같은가?
df['height'] >= 180

실행결과 ▶


2) 특정 컬럼만 추출

※ NumPy의 bool 형으로 나온 값을 데이터에 넣어 해당하는 값을 출력하는 방식과 동일하다.

# 바깥 df = 전체 데이터 프레임
# 안쪽 df = 180과 비교
# : 안쪽에서 180과 비교해서 True인 값을 바깥 df로 전체 인덱싱하여 데이터 출력
df[df['height'] >= 180]

실행결과 ▶


3) 여러 컬럼 선택

※ 방법1과 방법2는 같은 결과를 출력하지만 방법1 사용을 권장한다. (이해하기 더 쉽다)

# 180이상의 데이터 중 이름만 보고싶을때!
# 뒤에 보고싶은 시리즈(칼럼)을 추가해 인덱싱

# 방법 1
df[df['height'] >= 180]['name']

# 방법 2
df['name'][df['height'] >= 180]

실행결과 ▶


4) loc와 조건 결합하기 (많이 사용됨)

※ loc 왼쪽에는 행 조건, 오른쪽에는 열 조건이 들어간다.

# 행 조건 : df['height'] >= 180
# 열 조건 : ['name', 'gender', 'height']
df.loc[df['height'] >= 180, ['name', 'gender', 'height']]

실행결과 ▶


5) 여러 조건 (isin)

# 블루드 변수를 만들어 a,b를 넣고
# a,b가 있는지 없는지 확인 후 bool형태로 출력
blood = ['A', 'B']
df['blood'].isin(blood)

실행결과 ▶