Pandas
2022. 3. 18. 09:28ㆍPython
Pandas란?
- pandas는 "python data analysis"의 약자
- 테이블형태로 데이터를 다룰 수 있게 해주는 패키지 (python용 엑셀)
!pip install pandas # pandas install
import pandas as pd
## option setting
# 불러들이는 데이터에 맞춰 모든 컬럼을 확인 가능하도록 옵션값 설정
pd.options.display.max_columns = 200
pd.options.display.max_info_columns =200
DataFrame
- 테이블형태의 데이터 구조
- 다양한 형태의 데이터를 받아 사용할 수 있으며 다양한 통계, 시각화 함수를 제공
!pip install xlrd
!pip install openpyxl
!pip install pyxlsb
# ./ : 현재 경로
데이터 불러오기
- pandas는 다양한 데이터 파일 형태를 지원하며 주로 csv, xlsx, sql, json을 사용
read_csv()
read_excel()
read_sql()
read_json()
json_normalize()
df = pd.read_확장자명('파일경로.확장자')
df = pd.read_csv('./data/loan1.csv')
df1 = pd.read_excel('./data/loan1.xlsb',
sheet_name='구매영수증상세+상품마스터포함',
engine='pyxlsb',
encoding='cp949')
# ./ : 현재 경로
# 만약 모듈을 찾을 수 없는 오류가 발생한다면 추가 모듈 설치
# 필요 모듈 import
# !pip install xlrd
# !pip install openpyxl
# !pip install pyxlsb
# 데이터베이스로 부터 자료 읽기
# 필요한 모듈 추가 설치 - 각 데이터베이스 별로 다릅니다.
# !pip install pymysql
# sql 모듈 로드하기
# import pymysql
# mysql, mariadb, sqlite, postgresql, ms-sql, oracle, mongodb
# 접속하기
# 접속방법 또한 DB 종류에 따라 다릅니다.
# con = pymysql.connect(host='db서버주소', port=3306, user='id', passwd='pwd', db='dbname')
# query 만들기
# query = 'select * from samples'
# 자료 불러오기
# data = pd.read_sql(query, con=con)
데이터 저장하기
to_csv()
to_excel()
to_sql()
df = pd.read_csv('./data/save_test.csv', index=False)
# index=False 파라메터는 기존 데이터프레임의 인덱스를 무시하고 저장
데이터 살펴보기
df.head() # 데이터 확인
df.tail() # 데이터 확인
df.len() # 데이터 갯수
df.info() # 데엍 정보 확인
df.describe() # 데이터 기초통계량
df.shape # 속성 파악
df.index # 인덱스
df.columns # 컬럼명 순환하며 가능한 데이터프레임 정보확인
데이터 접근 ( 인덱싱 , 슬라이싱, 샘플링)
- Indexing : 데이터에서 어떤 특정 조건을 만족하는 원소를 찾는 방법
- iloc : 인덱스넘버로 데이터에 접근 가능
- 시리즈(Serise) : 각 컬럼이나, 행단위 접근했을 때 출력되는 벡터 데이터의 자료구조
- index, values로 각각의 속성에 접근 가능
df.iloc[색인]
df[텍스트형태의 컬럼명]
df.iloc[2] # 인덱싱 가능
df.iloc[10:21] # 슬라이싱 가능
df.take([10,20,30])
df['emp_title'] # 키값으로 접근
df['emp_title'].values # values값 접근
# 값을 np,array로 묶고, index와 values의 쌍으로 묶어진 딕셔너리
# 여러 컬럼 동시 접근
df[['emp_title','int_rate']]
# row와 columns을 동시에 슬라이싱 하는 속성
# df.loc[인덱스, 컬럼명]
df.loc[100:200 , ['emp_title','int_rate']]
# df의 컬럼명을 순환하면서 컬럼단위로 접근하고 각 컬럼의 고유값을 출력해주는 코드
for col_nm in df.columns:
print(col_nm, df[col_nm].unique())
# 고윳값 갯수 출력 #nunique
for col_nm in df.columns:
print(col_nm, df[col_nm].nunique())
팬시인덱싱
- bool 형태의 array를 조건을 전달하여 다차원 배열을 인덱싱하는 방법
- 조건식을 사용하여 분석에 필요한 데이터샘플을 추출하기 용이
# 조건식 샘플링 emp_title 이 ceo인 샘플들
df[df['emp_title']=='ceo']
# 신용등급 A와 B인 샘플접근
df[(df['grade']=='A')|(df['grade']=='B')]
# df loan_amnt 컬럼값이 10000이상인 채권샘플의 grade
df[(df['loan_amnt']>=10000)]['grade']
# df grade C 와 D 인 채권샘플 annual_inc 최대값인 인덱스 빼오기 (idxmax)
# 최대값 인덱스 빼와서 샘플까지 출력
df.take([df[(df['grade']=='C')|(df['grade']=='D')]['annual_inc'].idxmax()])
# 컬럼 내 문자열 내에 우리가 찾고싶은 문자열이 포함되어 있는지를 기준으로 샘플링
df[df['purpose'].str.contains('card')]
# df[df['purpose'].str.contains('card')]['title'].value_counts()
idxmax() : 최대값의 인덱스 반환
value_counts() : 값의 갯수 반환
데이터프레임 병합
- 데이터 병합에 사용가능한 key(병합할 기준이 되는 행 or 열)값이 있는경우
pd.merge (베이스데이터프레임, 병합할데이터프레임, (how, left_on, right_on))
# how : 'left', 'right', 'inner', 'outer'
# left_on : key값이 다를 경우 베이스데이터프레임의 key 설정
# right_on : key값이 다를 경우 병합데이터프레임의 key 설정
# pd.merge는 뷰값만 확인 : 재사용을 위해서는 변수에 저장 필요
- 단순 데이터 연결
pd.concat([베이스데이터프레임, 병합할데이터프레임], axis=0 or 1)
# axis : 0- row , 1- column
# 데이터프레임 행단위 병합
# df.columns == df1.columns
merged_df = pd.concat([df,df1])
인덱스 편집
- 인덱스 리셋
# 기존인덱스를 값 취급해서 데이터프레임의 컬럼으로 넣어줌 -> 인덱스가 날짜,시간일 경우 못 버림
merged_df.reset_index
# drop과 inplace
merged_df.reset_index(drop=True, inplace=True)
merged_df
# drop : 기존 인덱스 버림
# inplace : 원본값 변경
## merged_df = pd.concat([df,df1], ignore_index=True)
- 기존 컬럼값을 index로 사용
merged_df.set_index('id')
컬럼편집
- 데이터프레임의 컬럼을 변경
- 컬럼단위 샘플링 및 인덱싱, 이름변경이 가능
컬럼 선택
# df 컬럼명 접근
df.columns
# df의 개인정보에 관한 컬럼만을 색인으로 df를 슬라이싱하고 person_df 변수에 할당
df = merged_df[merged_df.columns[:25]]
df
컬럼 삭제
# 지울 column의 데이터값이 모두 NaN인지 확인
df['id'].isna().all()
df.drop('컬럼명', axis= , inplace= )
df.pop('컬럼명')
del df['컬럼명']
# 컬럼 삭제 (drop, del, pop)
df.drop('id',axis=1, inplace=True)
del df['member_id']
df.pop('url')
df.pop('desc')
컬럼명 변경
# home_ownership을 간략하게 home으로 변경
# 한글도 가능합니다만 권장하지는 않습니다.
df.rename()
df.rename(columns={'home_ownership':'home'}, inplace=True)
데이터프레임 형변환
# Owner, owner 같은 직업이지만 대소문자 구분에 따라 다른 값으로 취급되는 문제가 발생
# 대소문자 구분을 없애기 위해 모두 소문자로 데이터값을 변경
# 소문자 변환 전 혹시모를 int, float 데이터가 있을지 모를 상황에 대비해서 모두 문자열로 변경해주겠습니다.
형변환함수 : astype(데이터타입)
df['emp_title'] = df['emp_title'].astype(str)
- apply
df['컬럼명'] = df['컬럼명'].apply(lambda x: func(x) if 조건문)
df['컬럼명'] = df['컬럼명'].apply(func_nm)
df['emp_title'] = df['emp_title'].apply(lambda x : x.lower())
def make_lower(x):
return x.lower()
df['emp_title'] = df['emp_title'].apply(make_lower)
데이터 재구조화
- groupby : 조건 컬럼이 1개일 경우
# df.groupby('기준 컬럼').sum()
# df.groupby('emp_title').sum()
df.groupby('emp_title').mean()['annual_inc'].sort_values(ascending=False)
- pivot_table : 조건 컬럼이 2개일 경우
# pivot_table (묶어야 할 조건 컬럼이 두개일 경우)
pd.pivot_table(df, #데이터
index= , #조건1
columns= , #조건2
values= , #재구조 데이터프레임 안에 들어갈 데이터
aggfunc= , # 어떻게 묶을건지 : sum mean count
)
pd.pivot_table(df,
index= 'grade',
columns= 'sub_grade',
values= 'int_rate',
aggfunc=np.mean)
결측치 처리
- isnull(), isna() 함수를 이용해 결측치 확인
# 컬럼별 결측치 확인을 위한 isnull()함수 리턴값이 bool 형태로 반환되어 조건부 샘플링이 가능합니다.
df[df['emp_length'].isnull()]
# dti 컬럼의 NaN값 index 확인
df[df['dti'].isna()].index
# fillna() 함수로 NaN 값을 dti 컬럼의 평균으로 채우기
df['dti'].fillna(df['dti'].mean(), inplace=True)
# fillna() 함수의 다양한 채우기 방법 파라메터 확인해보기
df['dti'].fillna(method='bfill', inplace=True)
df['dti'].fillna(method='ffill', inplace=True)
# 두개 셋트로 묶어서 일반적으로 사용합니다. 맨첫번째 혹은 맨뒤데이터가 결측치
결측치 채우기
# 평균으로 채우기
fillna(df.mean())
# 두개 셋트로 묶어서 일반적으로 사용합니다. 맨첫번째 혹은 맨뒤데이터가 결측치
# bfill : 결측값을 아래값과 동일하게 채움
fillna(method='bfill')
# ffill : 결측값을 위값과 동일하게 채움
fillna(method='ffill')
# fillna() 함수로 NaN 값을 dti 컬럼의 평균으로 채우기
df['dti'].fillna(df['dti'].mean(), inplace=True)
# fillna() 함수의 다양한 채우기 방법 파라메터 확인해보기
df['dti'].fillna(method='bfill', inplace=True)
df['dti'].fillna(method='ffill', inplace=True)
결측치 제거
# view값으로 dropna 결과값 확인
# 결측치 처리하실 때 최후의 방법
df.dropna(inplace=True)