Pandas

2022. 3. 18. 09:28Python

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)

 

 

'Python' 카테고리의 다른 글

Class  (0) 2022.03.21
Visualization - Seaborn  (0) 2022.03.18
Numpy  (0) 2022.03.18
Function  (0) 2022.03.18
인덱싱  (0) 2022.03.18