Study/Python

Pandas 학습

NOredstone 2023. 10. 27. 16:25

Pandas 정의

- 데이터 조작 및 분석에 사용

- 다양한 파일 형식의 데이터 읽기 및 쓰기, 데이터 정리, 필터링, 그룹화, 병합, 재구성 및 데이터 계산 수행을 위한 광범위한 기능을 제공

 

Pandas 기본 사용법

# pandas 불러오기
import pandas as pd

# pd.Series(): 1차원 데이터를 위한 자료구조
# Serise 내부 구조: 인덱스가 자동으로 부여됨(딕셔너리의 키 개념과 유사)
# 인덱스는 문자 또는 숫자로 설정 가능하며, default는 0부터 시작하는 정수
# index: Series 객체의 인덱스에 접근, values: Series 객체의 값에 접근

data = [0,1,2,3]  #1차원 배열 생성
s = pd.Series(data)  #배열을 series 클래스로 변환
print(s)
print(s.shape)  #(4,)

data = [100,200,300]
index = ["a","b","c"]
s = pd.Series(data,index)
print(s)

 

Pandas 인덱싱

# Series 인덱싱

# s.iloc[행 번호]: 행 번호를 통해 객체 값 접근
print(s.iloc[1])  #200

# s.loc[인덱스]: 인덱스를 통해 객체 값 접근
print(s.loc["a"])  #100

# s.[]: 대괄호를 통해 객체 값 접근
print(s[0], s[1], s["a"])  #100 200 100

 

Pandas 슬라이싱

# Serise 슬라이싱

# s.iloc[]: iloc[행_start:end]
print(s.iloc[0:2])

# s.loc[]: loc[인덱스_start:end], end 인덱스를 포함함
print(s.loc["a":"b"])

# s.[]: [start:end]
print(s[0:2], s["a":"c"])

# 연속적이지 않은 값 인덱싱: 행 번호 또는 인덱스를 리스트로 구성해서 사용
target = [0,2]
print(s.iloc[target])

 

Pandas 값 접근, 추가, 삭제, 수정

# Series 값 접근, 추가, 삭제, 수정

# s.iloc[행번호, 열번호]: 해당 위치 값 접근
# s.loc[인덱스, 컬럼명]: 해당 위치 값 접근
# s.at[row_label, columns_label]: 특정 위치 값 읽거나 수정
print(s.at[2,'phone'])  # phone 라는 컬럼의 3번째(인덱스 2) 값 출력

# s.iloc[행번호 리스트, 열번호 리스트]: 해당 영역 값 접근
# s.loc[인덱스 리스트, 컬럼명 리스트]: 해당 영역 값 접근

# s.loc[인덱스] = 값: 딕셔너리와 유사한 방식으로 값 추가
data = [100,200,300]
index = ["a","b","c"]
s = pd.Series(data,index)
s.loc["d"] = 400
print(s)

# s.drop(인덱스): 원본은 유지하고 값이 삭제된 객체 리턴
data = [100,200,300]
index = ["a","b","c"]
s = pd.Series(data,index)
s1 = s.drop("a")
print(s1)

# Series 행번호나 인덱스를 사용하여 value 수정 가능
data = [100,200,300]
index = ["a","b","c"]
s = pd.Series(data,index)
s.iloc[0] = 1000
s.loc["b"] = 2000
print(s)

 

 

Pandas 연산

# Series 연산

# 연산이 Series 객체의 전체 값에 적용됨(Numpy와 동일)
s = pd.Series([100,200,300])
print(s + 10)
s1 = pd.Series([10,20,30])
print(s - s1)

# 값은 인덱스 기준으로 사칙연산 적용됨 (순서 상관없이 인덱스 기준)
s2 = pd.Series(data=[100,200,300], index=["a","b","c"])
s3 = pd.Series(data=[10,20,30], index=["a","b","d"])
print(s2-s3)

# 비교 연산 결과로 Boolen 타입이 저장된 Series가 리턴됨
s = pd.Series([100,200,300])
s1 = s > 200
print(s1)

# True/False 값을 통해 True 값만 필터링 가능
s = pd.Series([100,200,300])
s1 = s > 200
print(s[s1])

 

Pandas Column

# df.columns: 컬럼명 출력
print(df.columns[5])  # 6번째 컬럼명 출력

# df.dtype: 데이터 타입 출력
print(df.dtypes[5])  # 6번째 컬럼의 데이터 타입 출력

# df.select_dtypes(inclue=[], exclude=[]): 특정 데이터 타입을 가진 컬럼을 선택
z = df.select_dtypes(include=['int64','float64'])
print(z.columns)  # 수치형 변수를 가진 컬럼 출력

# 컬럼 추가 및 삭제
# df['컬럼명'] = 시리즈 객체
# df.drop('컬럼명', axis=1): 원본 유지되고 컬럼 삭제된 새로운 데이터프레임 객체 리턴됨

# row 추가 및 삭제
# df.loc[인덱스] = 데이터
# df.drop(인덱스, axis=0): 원본 유지되고 row 삭제된 새로운 데이터프레임 객체 리턴됨

 

Pandas DataFrame

# pd.DataFrame({'컬럼명':[데이터],'컬럼명2':[데이터]},index=인덱스명)

# pd.read_csv('파일경로\파일명', encording=''): csv 파일 불러오기
df = pd.read_csv('hello\names.csv')
print(df)

# 데이터 상위/하위 행 출력
# df.head(숫자): 데이터 상위 n개 행 출력(default: 5)
print(df.head())
# df.tail(숫자): 데이터 하위 n개 행 출력(default: 5)
print(df.tail())

# df.describe(): 통계정보 출력
print(df.describe())

# df.reindex(new_index): 인덱스 변경
# df.reindex(column=['ab','cd']: 컬럼 순서 변경
index = ['a','b','c']
df = pd.DataFrame({"가:[100,200,300],"나:[10,20,30]},index=index)
new_index = ['h','i','j']
df.reindex(new_index)  # 인덱스 abc에서 hij로 변경됨

 

Pandas 결측값 처리

from numpy import nan as NA
data = pd.DataFrame([[1., 6.5, 3.], [1., NA, NA], [NA, NA, NA], [NA, 6.5, 3.]])
print(data)

# df.dropna(axis=0/1): 결측 값이 있는 행/열 삭제
cleaned = data.dropna(axis=0)
print(cleaned)

# df.fillna(특정값): 특정 값으로 결측값 대체
filled = data.fillna(0)
print(filled)

# df.fillna({'컬럼명':특정값, '컬럼명2':특정값}): 컬럼별로 결측값을 다르게 대체
filled2 = data.fillna({1:0.5, 2:1})
print(filled2)

 

Pandas filtering

# df[df['컬럼명']=='값']
# df[(조건1)&(조건2)]: 조건 둘다 만족해야 할 때
# df[(조건1)|(조건2)]: 조건 중 하나라도 만족하면 될 때

k = data[(data['0'] < -2.5) | (data['0'] > 2.5)]  # '0' 컬럼의 값이 -2.5보다 작거나 2.5보다 큰 row만 지정
print(k)

 

- 데이터 로드 방법
  > read_csv(): 쉼표로 구분된 파일 읽어옴
  > pandas.read_csv('[file_path/file_name.csv]')
  > read_excel(): 엑셀 파일 읽어옴
  > read_table(): 탭으로 구분된 파일 읽어옴
  > read_fwf(): 구분자가 없는 파일 읽어옴

- 데이터 로드 시 옵션
  > sep: 구분자 지정
  > header: 컬럼 이름 지정
  > index_col: index로 사용할 컬럼 지정
  > encoding: 인코딩 지정

- 데이터 저장 방법
  > to_csv: csv 파일로 저장
  > to_excel: 엑셀 파일로 저장
  > to_json: json 파일로 저장
  > [data_name].to_csv('[file_path/file_name.csv]',[option])