Pandas 총정리

솔비·2024년 4월 3일
0
post-custom-banner

1. 기초정보

import pandas as pd


1-1) series

인덱스 + 데이터

- 생성

딕셔너리

pd.series({key:value, key:value, ...})

이때, key = index, value = data

리스트

pd.series([data, data, ...])

이때, data = data
index의 경우 자동생성 (or index = []로 지정)

- 데이터확인

변수.value : Data 조회
변수.index : index 조회
변수.dtypes : 데이터타입 조회



1-2) Dataframe

인덱스 + 컬럼 + 데이터 : 테이블

- 생성

딕셔너리

pd.DataFrame(
{key : [data, data, ..], key : [data, data, ..], ...}
)

이때, key = 컬럼, data 담긴 리스트 = 해당 컬럼 data
인덱스 자동생성 (or index = []로 지정)

리스트

pd.DataFrame(
[[data, data, ..], [data, data, ..], ...]
, columns = []
)

이때, data 리스트의 요소 수, 컬럼리스트의 요소수가 모두 동일해야함.
인덱스 자동생성 (or index = []로 지정)

시리즈 결합

pd.DataFrame(
{컬럼명 : 시리즈, 컬럼명 : 시리즈}
)

인덱스 자동생성 (or index = []로 지정)

- 데이터확인

df.values : 데이터확인
df.index : 인덱스확인
df.columns : 컬럼확인
df.shape : 행열 수 튜플로 반환
df.dtypes : 데이터타입확인
df.select_dtypes('타입') : 특정타입을 가진 컬럼만 반환





2. 불러오기


2-1) CSV

pd.read_csv('파일경로')

: csv파일 불러오기

[매개변수]

  • usecols = ['사용할컬럼']
  • index_col = ['인덱스로 사용할 컬럼']

[encoding]

  • 무시
    • encoding_errors = 'ignore'
  • encoding 포맷값 찾기
#모듈설치
pip install chardet

import chardet

with open('경로', 'rb') as rawdata:
    result = chardet.detect(rawdata.read(10000))
출처: https://gmnam.tistory.com/291 [Voyager:티스토리]
  • 웬만하면 : utf-8 or cp949
pd.to_csv('파일경로')

: csv파일 내보내기



2-2) excel

pd.read_excel('파일경로')

: csv파일 불러오기

[매개변수]

  • usecols = ['사용할컬럼']
  • index_col = ['인덱스로 사용할 컬럼']
  • header = 컬럼으로 쓸 행번호
  • sheet_name = '시트이름'
pd.to_excel('파일경로')

: csv파일 내보내기



2-3)html

pd.read_html('링크', encoding = )



2-4)json

import json

with open('파일경로', 'r') as file:
    geojson = json.load(file)



- 코랩이용시

from google.colab import drive

drive.mount('/content/drive')





3.조회


- 전체

df.head()
df.tail()



- 행 (인덱스)

df[ (이자리부터) : (이자리앞까지) ] : 인덱스 슬라이싱



- 열 (컬럼)

df['컬럼명']
df.컬럼명 : frame형태로 보고 싶을 때 to_frame()
df['컬럼명','컬럼명','컬럼명',...]



- 특정위치

df.loc['행이름','열이름']

  • 열생략가능
  • 행생략시 행이름 자리에 :

df.loc[ ['행이름','행이름'],['열이름','열이름']]

  • 슬라이싱 또는 ,로 여러개 조회가능

df.iloc['행번호','열번호']

  • 열생략가능
  • 행생략시 행이름 자리에 :

df.loc[ ['행번호','행번호'],['열번호','열번호']]

  • 슬라이싱 또는 ,로 여러개 조회가능



- 특정조건

df[조건식]
df.query('조건식')

[조건식]

  • isin : 포함여부
  • & : and
  • | : or

ex)

df[df['컬럼명']=1]
= df.query('"컬럼명"==1')
df[df['컬럼명'].isin([data])]
= df.query('"컬럼명" in [data]')

-> query시 변수를 넣어 조건을 넣고 싶다면 @변수명





4. 가공


4-1)인덱스

- 변경

일부 : df.rename({인덱스:바꿀인덱스,인덱스:바꿀인덱스,...})
전체 : df.index = [바꿀 인덱스리스트]

- 컬럼 -> 인덱스

df.set_index('컬럼명', replace = True)

- 인덱스 -> 컬럼

df.reset_index('컬럼명')

  • drop = True :해당열 삭제시



4-2)행

  • 추가 : pd.concat([df1,df2])
  • 제거 : pd.drop('인덱스명', axis = 0)
  • 중복제거 : pd.drop_duplicates()
    • subset=['컬럼명'] : 특정컬럼중복제거
    • keep = first, last, False : 어떤값 유지할지 (첫번째, 마지막, 모두지우기)
    • inplace

duplicated()
: 중복행인지 True, False 반환

  • 필터링 : df[df.duplicated()]
  • 조회
if df.duplicated() :
  print('중복')
else :
  print('중복X')



4-3)열

  • 추가 : df['추가할 컬럼명'] = 값
  • 제거 : df.drop('제거할컬럼명', axis = 1)
  • 변경
    • 일부 df.rename({컬럼명:바꿀컬럼명,컬럼명:바꿀컬럼명,...})
    • 전체 : df.columns = [컬러리스트]





6. 결측값


- 확인

df.isna() : Nan이면 True
df.isnull() : Nan이면 True
df.notna() : Nan이면 False

sum()
위에 .sum()을 함께쓰면 각 컬럼의 null수를 확인 가능하다.



- 제거

df.dropna()

  • axis = 0 : 행, 1 : 열
  • how = any : 존재하면제거, all : 모두결측이면제거
  • subset = 컬렴 or 인덱스 : 특정컬럼 or idx만 제거



- 대체

df.fillna('대체값')

  • method = ffill : 위 데이터로 채우기 , bfill : 아래데이터로 채우기





7. 날짜다루기


- 문자 -> 날짜

pd.to_datetime('컬럼', format = '날짜형식')
df['컬럼'].to_datetime()

[날짜형식]
ex) %Y-%m

  • %Y : 4자리연도
  • %y : 2자리연도
  • %m : 월
  • %d : 일
  • %H : 시
  • %M : 분
  • %S : 초



- 원하는 형태로 날짜포맷

df['컬럼'].dt.strftime('날짜형식')

[dt연산]

  • df['Date1'].dt.year : 연도
  • df['Date1'].dt.month : 월
  • df['Date1'].dt.day : 일
  • df['Date1'].dt.date : 년-월-일
  • df['Date1'].dt.dayofweek : 요일(0-월요일, 6-일요일)
  • df['Date1'].dt.day_name() : 요일을 문자열로

: 각각 날짜컬럼의 연도, 월, 일, 요일을 추출



- 날짜계산

day 연산 : pd.Timedelta(day=숫자)

from pandas.tseries.offsets import DateOffset

month 연산: DateOffset(months=숫자)
year 연산: DateOffset(years=숫자)

: 날짜컬럼에 더하기 빼기 가능
ex) df['Date1'] - pd.Timedelta(days=7)



- 날짜구간만들기

pd.date_range(start=시작일자, end=종료일자, periods=기간수, freq=주기)

형식설명
D일별
W주별
M월별 말일
MS월별 시작일
A연도별 말일
AS연도별 시작일





8. 추가기능


- apply함수

사용자 정의함수를 적용하고 싶을 때

df.apply(함수, axis = 0 or 1)

  • axis의 경우 컬럼 단독에 사용할 시 생략가능
  • 함수의 경우 lambda로 간략하게 설정가능
# EX)
df1['pclass_sibsp_lambda'] = df1.apply(lambda x: 1 if x['Pclass'] == 1 and x['SibSp'] == 1 else 0, axis=1)



- map함수

값을 특정 딕셔너리로 치환하고 싶을 때

df['컬럼'].map(딕셔너리)

# EX)
gender_map = {'male':'남자', 'female':'여자'}
df1['Sex_kr'] = df1['Sex'].map(gender_map)



- 문자열다루기

컬럼.str.contains('문자열') : 특정문자포함여부
컬럼.str.replace('기존문자','바꿀문자') : 문자변경
컬럼.str.split('문자') : 특정문자 기준 나누기

  • expand = True | 나눌지 여부
  • n = 개수
    컬럼.str.lower() : 소문자
    컬럼.str.upper() : 대문자



- 결합

pd.merge(df1, df2, on = '기준컬럼', how = )

  • 기준컬럼명이 서로 다를 경우
    • left_on = / right_on =
  • how
    • inner
    • left
    • right
    • outer



- 데이터집계

df.describe()
: 컬럼별 값의개수 / 평균 / 표준편차 / 최소값 / 최대값 / 사분위수



-대표값

df.min(numeric_only = True) : 최소값
df.max(numeric_only = True) : 최대값
df.mean(numeric_only = True) : 평균
df.median(numeric_only = True) : 중간값
df.std(numeric_only = True) : 표준편차
df.var(numeric_only = True) : 분산
df.quantile(0.n, numeric_only = True) : : 사분위수

표준편차
: 분산에 루트씌운값
-> 평균으로부터 떨어진 수



- 상관관계

df.corr()





9. groupby


df.groupby('기준열')['연산할 열'].연산()
df.groupby(['기준열','기준열'])[['연산할 열','연산할 열']].연산()

연산이 여러개일 경우 : .aggregate([np.mean,np.min,...])





10. crosstab


범주형 데이터 분석 시





11. pivot table






11. stack, unstack, melt



Study Note
profile
Study Log
post-custom-banner

0개의 댓글