파이썬/라이브러리(API)

파이썬 판다스 Pandas 기본 문법 및 기초 사용법

코데방 2024. 3. 6.
728x90

판다스 사용하기

 

판다스 라이브러리는 파이썬에서 표 형태의 데이터분석을 할 때 가장 많이 사용되는 라이브러리입니다. 엑셀, csv, tsv, pickle 등과 연동해 사용할 수도 있습니다. 

 

데이터의 결측치를 쉽게 처리할 수 있고 형태 변형, 삭제, 추가 등이 용이하며 그룹화, 정렬, 결합이 쉽습니다. 또한 데이터의 시각화를 할 수 있는 다양한 기능이 있으며 문자열 및 날짜, 시간 처리도 간편합니다. 

 

역시 아나콘다를 설치할 경우 자동으로 설치되고, 없다면 터미널에서 "pip install pandas" 명령어를 통해 설치해주면 됩니다. 통상적으로 "pd"로 명명해 사용합니다.

 

import pandas as pd

 

 

 

 

판다스에서 CSV, TSV 파일 데이터 불러오기

 

 

먼저 "read_csv()" 메소드를 통해 콤마로 구분되어 있는 "CSV"파일과, 탭으로 구분되어 있는 "TSV" 파일 불러오기입니다. 둘 다 "read_csv()" 메소드를 통해 간단히 불러올 수 있습니다.

 

기본 구분자가 (sep = ",")로 설정되어 있기 때문에 CSV는 그냥 파일 이름만 넣어주면 되고 TSV의 경우 구분자를 탭으로 바꿔줘야 합니다. (sep = "\t")

 

  • CSV 파일 불러오기 : pd.read_csv("파일이름.csv")
  • TSV 파일 불러오기 : pd.read_csv("파일이름.tsv", sep = "\t")
import pandas as pd

csv = pd.read_csv("concat_1.csv")
print(csv)

tsv = pd.read_csv("gapminder.tsv", sep = '\t')
print(tsv)

 

 

 

 

만약 한글이 깨지거나 여는데 에러가 난다면 인코딩 옵션을 추가해주면 됩니다. 보통 한글 인코딩은 "EUC-KR", "UTF-8", "CP949" 세 개 중 하나로 되어 있습니다. 

# 인코딩 옵션 추가
csv = pd.read_csv("concat_1.csv", encoding = "euc-kr")

 

 

 

 

데이터 편집 후 CSV나 TSV로 저장한다면 아래와 같이 사용해주면 됩니다. df는 아래에서 다룰 판다스의 데이터프레임 객체입니다. 인덱스 옵션을 통해 행번호를 제외할 수도 있습니다. 

# CSV로 저장하기
df.to_csv("파일이름.csv")

# 인덱스 유무 옵션
df.to_csv("파일이름.csv", index = False)

 

 

 

TSV는 불러올 때처럼 꼭 "sep" 옵션을 줘야합니다. 

# TSV로 저장하기
df.to_csv("파일이름.tsv", sep = "\t")

 

 

 

판다스에서 엑셀 파일 데이터 불러오기

 

CSV와 비슷하게 "read_excel()" 메소드를 사용해 불러와주면 됩니다. 엑섹은 여러 시트를 가지고 있을 수 있기 때문에 "sheep_name = 이름" 옵션을 통해 원하는 시트를 불러올 수 있습니다.

 

주의할 점은 셀병합이 되어 있을 경우 에러가 나거나 데이터가 제대로 로드되지 않기 때문에 꼭 병합을 미리 풀어줘야합니다. 

pd.read_excel("엑셀파일.xlsx", sheet_name = "시트이름")

 

 

 

"to_excel()" 메소드를 통해 다시 엑셀파일로 저장해줄 수 있습니다. 역시 인덱스 옵션을 사용해 행번호를 제외할 수 있습니다. 

df.to_excel("파일이름.xlsx")

df.to_excel("파일이름.xlsx", index = False)

 

 

 

 

판다스에서 피클(Pickle) 파일 불러오기

 

피클은 파이썬에서 데이터를 다룰 때 많이 사용됩니다. 위의 문서들과 달리 어떠한 프로그램에서 쉽게 시각적으로 접근하긴 힘들지만 대신 훤씬 빠르고 성능이 좋습니다.

pd.read_pickle("파일이름.pickle")

 

 

 

마찬가지로 저장할 때는 "to_pickle()" 을 사용합니다.

df.to_pickle("파일이름.pickle")

 

 

 

 

 

시리즈와 데이터프레임

 

판다스는 기본적으로 엑셀과 같은 표 형태의 데이터를 분석하는데 많이 사용됩니다. 그 중 열을 "시리즈", 표 전체를 "데이터프레임"이라고 부릅니다.

 

 

  • 시리즈 : 열 (위에서 아래로 내려가는 한 줄의 데이터)
  • 데이터프레임 : 표 전체

 

 

 

 

 

판다스 시리즈 만들기

 

데이터프레임의 시리즈를 만드는 방법은 여러가지가 있습니다. 

 

 

1. 딕셔너리를 사용해서 시리즈 만들기

 

딕셔너리를 이용하면 인덱스와 데이터를 같이 생성할 수 있습니다. 

import pandas as pd

s = pd.Series({"a" : 1, "b" : 2, "c" : 3})
print(s)

 

 

 

2. 리스트를 사용해서 시리즈 만들기

 

리스트를 이용해 시리즈를 만들면 인덱스 값은 자동으로 0부터의 숫자로 채워집니다.

import pandas as pd

s = pd.Series(["가", "나", "다"])
print(s)

 

 

 

 

 

판다스 데이터프레임 만들기

 

데이터프레임을 만드는 방법 또한 시리즈와 비슷합니다.

 

 

1. 딕셔너리를 사용해 데이터프레임 만들기

 

딕셔너리의 키(key)값이 데이터프레임(표)의 열 값이 됩니다. 

import pandas as pd

dic = {"글자": ["가", "나", "다"], 
       "숫자": [1, 2, 3], 
       "영문": ["a", "b", "c"]}

# 데이터프레임생성
df = pd.DataFrame(dic)

print(df)

 

 

 

"DataFrame()" 메소드에 "index" 옵션을 추가하면 자동으로 들어가는 숫자 대신 인덱스 값을 넣어줄 수도 있습니다.

import pandas as pd

dic = {"글자": ["가", "나", "다"], 
       "숫자": [1, 2, 3], 
       "영문": ["a", "b", "c"]}

# 데이터프레임생성 (인덱스 추가)
df = pd.DataFrame(dic, index = ["인덱스1", "인덱스2", "인덱스3"])

print(df)

 

 

 

만약 열의 순서를 조정해줘야한다면 "Columns" 옵션을 추가해주면 됩니다. 

import pandas as pd

dic = {"글자": ["가", "나", "다"], 
       "숫자": [1, 2, 3], 
       "영문": ["a", "b", "c"]}

# 데이터프레임생성 (인덱스 추가, 시리즈 순서 변경)
df = pd.DataFrame(dic, index = ["인덱스1", "인덱스2", "인덱스3"],
                  columns = ["영문", "숫자", "글자"])

print(df)

 

 

2. 리스트를 사용해 데이터프레임 만들기

 

리스트를 사용하면 조금 더 직관적인 형태로 데이터프레임을 만들 수 있습니다. 표와 같은 구조로 만들어주면 됩니다. 인덱스와 컬럼명(열이름) 옵션은 동일합니다.

 

import pandas as pd

lst = [["가", 1, "a"], ["나", 2, "b"], ["다", 3, "c"]]

# 데이터프레임생성 (인덱스 추가, 시리즈 순서 변경)
df = pd.DataFrame(
    lst, index=["인덱스1", "인덱스2", "인덱스3"], columns=["글자", "숫자", "영문"]
)

print(df)

 

 

 

 

아래와 같이 "df.columns"와 "df.index"를 통해 데이터프레임의 행이름(인덱스)와 열이름(시리즈)를 알 수 있습니다. 

print(df.columns)
print(df.index)

 

판다스 시리즈와 데이터프레임 다루기

 

 

데이터프레임에서 열(시리즈)에 접근하는 방법은 아래와 같습니다. 여러 개의 열에 접근할 경우 리스트로 묶어줘야 합니다. 

 

  • df[열1]
  • df[[열1, 열2...]]

 

 

행에 접근하는 방법은 아래와 같습니다.

 

  • loc : 이름으로 접근 ==> loc["행이름"]
  • iloc : 순서로 접근 ==> iloc[0]

 

 

원하는 행과 원하는 열에 동시 접근하는 방법은 아래와 같습니다.

 

  • loc[[행이름1, 행이름2, 행이름3], [열이름1, 열이름2]]
  • iloc[[행번호1, 행번호2, 행번호3]. [열번호1, 열번호2]]

 

 

조건을 통해 원하는 행만 추출하는 것도 가능합니다.

 

  • df[조건]  
  • df[(조건1) & (조건2)]  ==> and  
  • df[(조건1) | (조건2)]  ==> or
  • 예시) 나이가 평균보다 큰 값만 골라내기 ==> df[df["나이"] == 20 > df["나이"].mean()]

 

 

데이터가 너무 크다면 머리 부분 또는 꼬리부분에서부터 원하는 만큼 추출할 수도 있습니다. 

 

  • df.head(n = 갯수)  ==> 머리부분
  • df.tail(n = 갯수) ==> 꼬리부분

 

 

데이터프레임의 행과 열의 갯수를 확인합니다.

 

  • df.shape

 

 

열이 많아서 시각적으로 확인이 어려우면 열이름만 따로 불러와 확인할 수 있습니다. 

 

  • df.columns  ==> 열이름 확인

 

 

데이터프레임과 시리즈의 정보를 확인합니다.

 

  • df.dtypes ==> 열의 자료형 확인 (문자열은 object로 표기)
  • df.info()  ==? 데이터프레임의 자세한 정보 확인

 

시리즈에서 중복 데이터를 삭제할 수 있습니다. DB에 있는 기능들이 많이 보이네요.

 

  • df.drop_duplicates()

 

값을 찾아 변경합니다.

 

  • s.replace(찾을 값, 변경 값)

 

 

시리즈에서 랜덤으로 데이터를 임의 추출할 수도 있습니다. 통계 시 유용합니다.

 

  • s.sample(n)

 

 

시리즈의 값 또는 행의 인덱스 번호를 정렬해줄 수 있습니다.

 

  • s.sort_values()  ==>  값으로 정렬, 오름차순
  • s.sort_values(ascending = False)  ==> 값으로 정렬, 내림차순
  • s.sort_index() ==> 행번호로 정렬, 오름차순
  • s.sort_index(ascending = False) ==> 행번호로 정렬, 내림차순

 

 

데이터프레임에서 정렬을 하기 위해서는 "by=컬럼명" 옵션을 통해 기준이 되는 컬럼 지정을 해줘야 합니다.

 

  • df.sort_values(by = "컬럼명")
  • df.sort_values(by =["컬럼1", "컬럼2"....])  ==> 컬럼 순서대로 정렬

 

 

시리즈에서 각각의 데이터가 몇 개인지 세주는 방법입니다.

 

  • df["컬럼"].count()   ==>  NaN을 제외한 전체 컬럼 데이터의 갯수
  • df["컬럼"].value_counts()  ==>  각 데이터 별 갯수

 

 

데이터의 행, 열 데이터의 합계를 구할 수 있습니다. "axis = 1" 옵션은 언제나 행(가로)단위를 의미합니다.

 

  • sum() ==> 열(세로) 합계 
  • sum(axis = 1) ==> 행(가로)합계

 

 

서로 다른 타입의 열의 내용을 불러와 붙여주는 작업이 필요하다면 타입변환을 사용할 수 있습니다.

 

  • df["컬럼"].astype(자료형) ==> int, float, str, bool 등

 

 

 

판다스의 아주 유용한 기능 중 하나인 문자열로 된 날짜 데이터를 시간데이터로 변환하는 메소드입니다. 날짜끼리의 계산이 가능하도록 만들어줍니다. 

 

  • pd.to_datetime()  ==>  df["날짜열"] = pd.to_datetime(df["날짜열"]) 



특정 열을 인덱스 값으로 변경하고 싶으면 아래와 같이 사용할 수 있습니다. 

 

  • df.set_index("컬럼")
    • 해당 컬럼을 인덱스로 만들어줌
    • 원본이 변경되지는 않음
    • df = df.set_index("컬럼") 형태로 사용해야 원본이 바뀜
  • df.set_index("컬럼", inplace = True)
    • inplace 옵션을 True로 줄 경우 원본 데이터가 바뀜
  • df.reset_index()
    • 현재 인덱스를 가장 첫 번째 열로 만들어주고 인덱스를 정수로 초기화함
  • df.reset_index(drop = True)
    • 현재 인덱스를 버리고 정수로 초기화함

 

 

날짜형으로 변환되었다면 연, 월, 일만 따로 골라낼 수 있습니다.

 

  • df["날짜열"].dt.year  ==> 년
  • df["날짜열"].dt.month ==> 월
  • df["날짜열"].dt.day ==>일

 

 

판다스 기초 통계 함수

 

 

1. 판다스로 그루핑(집단화)하기 ==> Groupby 

 

엑셀에서의 sumif, countif 또는 피봇 기능과 같이 특정 열의 값들을 기준으로 묶어 통계를 구해주는 방법입니다. 

 

예를 들어 아주 큰 데이터에 남자와 여자라는 구분자가 있을 때 그루핑을 하게 되면 남자들의 모든 데이터를 통계로 계산할 수 있고, 여자들의 모든 데이터 또한 통계로 계산할 수 있게 됩니다.

 

아래와 같은 통계 함수들이 있습니다. 

판다스 통계 함수 설명
count 누락값을 "제외"한 데이터 갯수
size 누락값을 "포함"한 데이터 갯수
nunique 중복되지 않은 데이터 갯수 (모든 중복값은 1로 처리)
mean 평균
std 표준편차
min 최소값
max 최대값
sum 합계
var 분산
describe 요약 통계량
first 첫번째 행
last 마지막 행

 

 

 

먼저 아래와 같은 데이터를 열어보겠습니다.

import pandas as pd

df = pd.read_csv("gapminder.tsv", sep = "\t")

print(df)

 

 

 

데이턷에서"year"은 출생년도이고 "lifeExp"는 수명입니다. 

먼저 출생년도를 기준으로 그루핑을 해줍니다. 

import pandas as pd

# TSV 데이터 불러오기
df = pd.read_csv("gapminder.tsv", sep = "\t")

# 그룹핑하기 (집단화하고 싶은 열 이름 == 출생년도)
grouping = df.groupby("year")

 

 

 

 

이번 통계에서 구해볼 데이터는 출생년도 별 수명(lifeExp)의 평균입니다.

그루핑 된 객체 "grouping"에서 평균을 구하는 "mean()" 메소드를 사용해 해당 객체를 받아줍니다.

파이썬은 다른 언어와 달리 타입이 자동 지정이라 정말 편하네요..

 

결과를 출력하면 출생년도 별 평균 수명 데이터를 얻을 수 있습니다. 

import pandas as pd

# TSV 데이터 불러오기
df = pd.read_csv("gapminder.tsv", sep = "\t")

# 그룹핑하기 (집단화하고 싶은 열 이름 == 출생년도)
grouping = df.groupby("year")

# 그룹핑 된 데이터에서 접근할 열 선택 (살아온 시간)
mean = grouping["lifeExp"].mean()

print(mean)

 

 

 

 

엑셀의 피봇같이 그룹핑을 순서대로 지정할 수도 있습니다.

위에서는 출생년도만을 기준으로 그룹핑했지만 출생년도로 묶고 거기서 다시 한 번 나라(Country)별로 묶어서 계산해볼 수도 있습니다. 

이 때는 "groupby" 메소드에 매개변수를 리스트 형태로 묶어서 여러개를 주면 됩니다. 

import pandas as pd

# TSV 데이터 불러오기
df = pd.read_csv("gapminder.tsv", sep = "\t")

# 그룹핑하기 (집단화하고 싶은 열 이름 == 출생년도, 나라별)
grouping = df.groupby(["year", "country"])

# 그룹핑 된 데이터에서 접근할 열 선택 (살아온 시간)
mean = grouping["lifeExp"].mean()

print(mean)

 

 

 

 

이번에는 위 자료에서 대륙("continent")별로 나라("country")가 몇 개가 있는지 그룹핑해 카운트해보는 작업입니다. 

 

나라이름의 경우 중복값이 많기 때문에 "count"를 사용할 경우 중복된 모든 값들의 갯수가 나오게 됩니다. 따라서 중복값을 처리해주는 "nunique"를 사용해서 갯수를 세줘야 합니다. 

import pandas as pd

# TSV 데이터 불러오기
df = pd.read_csv("gapminder.tsv", sep = "\t")

# 그룹핑하기 (집단화하고 싶은 열 이름 == 대륙이름)
grouping = df.groupby(["continent"])

# 그룹핑 된 데이터에서 접근할 열 선택 및 통계적용(중복없는 갯수)
mean = grouping["country"].nunique()

print(mean)

 

728x90

댓글

💲 추천 글