[Python라이브러리 +] Pandas의 Dataframe 자세히 파헤치기

MINJEE·2023년 9월 4일
post-thumbnail

판다스(PANDAS)

0. pandas 라이브러리 임포트

import pandas as pd   # pandas 라이브러리 불러오기

1. 데이터 불러오기

pd.read_excel(’파일경로/파일명.xlsx’, index_col=’컬럼명’)
pd.read_csv(’파일경로/파일명.csv’, index_col=’컬럼명’, encoding='인코딩방식')
  • 파일경로
    • 절대경로 : C:부터 지정하는 경로 (“C:/폴더명/파일명.확장자”)
    • 상대경로 : 현재위치(./)를 기준으로 지정하는 경로 (“./폴더명/파일명.확장자”)
  • index_col = ‘컬럼명’ 또는 칼럼번호 : 인덱스로 사용할 컬럼 지정
  • encoding = ‘utf-8’(기본값) / ‘cp949’ (MS-Office 엑셀에서 저장한 경우)
  • header = 행인덱스번호 : 몇번째 행부터 표 데이터로 볼것인지 지정
  • thousands = ‘,’ : 천단위기호(,)사용 → x,xxx를 문자가 아닌 숫자로 인식

pd.set_option('display.max_columns', n)  # 컬럼개수 지정
  • 컬럼개수가 많아 가운데 ‘…’으로 생략될 경우, n개 컬럼 보이게 지정

2. 데이터 확인하기

df.head()       # 데이터프레임의 앞의 5개 확인(개수지정 가능)
df.tail()       # 데이터프레임의 뒤의 5개 확인 (개수지정 가능)
df.info()       # 데이터구조 확인 (데이터 개수/종류 확인) 
df.describe()   # 수치형 칼럼의 기초통계량
df.set_index(’칼럼명’)  # 인덱스로 사용할 칼럼 지정
df.shape        # (행 개수, 열 개수)반환 

3. 데이터 선택하기

df.iloc[행번호, 열번호]     # 숫자(번호)로 인덱싱
df.loc[’행이름’, ‘열이름’]  # 행/열 이름으로 인덱싱
	# 또는 df.loc[행번호, ‘열이름’] 
    # 또는 df[’열이름’][행번호]
    
# 복수 선택가능
# 방법1 - 시작:종료 형태로 범위 지정 
df.iloc[ 1, 1:3]
# 방법2 - list 사용
df.loc[ : , [’칼럼명1, ‘칼럼명2]]
    
df[’칼럼명’]   # 특정 칼럼 선택
df[ 조건 ]    # 불리언 인덱싱 : 조건 만족하는 특정 인덱스 선택
	# 조건 : df[’칼럼명’] 을 이용한 조건식, &(그리고),|(또는)을 이용하여 여러 조건식 가능
  • 불리언 인덱싱 예시
    data[ (data['수학']>80) & (data['영어']>70) ]
    : '수학'이 80보다 크고, '영어'가 70보다 큰 데이터 선택

4. 데이터 추가하기

df[’new칼럼명’] =# 새로 추가할 칼럼명의 모든 데이터에 값을 추가
df[’new칼럼명’] = [1,2,] # 새로 추가할 칼럼명의 데이터에 인덱스 순서대로 값1,값2,…를 추가
df[’new칼럼명’] = 기존 칼럼명을 이용한 수식
  • 예시
    • data['음악'] = 90
      : 칼럼에 '음악'을 추가하고 해당 값을 모두 90으로 추가
    • data['체육'] = [100,90,60]
      : 칼럼에 '체육'을 추가하고 각 인덱스에 100,90,60을 차례대로 추가
    • data['국영수'] = (data['국어']+ data['영어']+data['수학'])/3
      : 칼럼'국영수'를 추가하고 국어,수학,영어의 평균을 추가

5. 데이터 표 병합하기

pd.merge(df1, df2, how = 'left | right | inner | outer',
	left_on='컬럼명1',  right_on='컬럼명2',
    left_index=True|False, right_index=True|False,
    on='동일컬럼명')  # 데이터프레임 2개를 옆으로 병합
  • how = ‘left’ | ‘right’ | ‘inner’ | ‘outer’ : 병합 기준
    • left : 왼쪽 테이블(df1)의 키 값을 기준으로 병합
    • right : 오른쪽 테이블(df2)의 키 값을 기준으로 병합
    • inner : 양쪽 테이블에 동시에 존재하는 키 값을 기준으로 병합
    • outer : 양쪽 테이블 중 한번이라도 존재하는 모든 키 값을 기준으로 병합
  • left_on=‘칼럼명1’, right_on=‘칼럼명2’ : 칼럼명을 키 값으로 병합 (왼쪽테이블의 ‘칼럼명1’과 오른쪽테이블의 ‘칼럼명2’를 키 값으로 병합)
  • on = ‘칼럼명’ : 양쪽테이블의 키 값으로 사용할 칼럼명이 동일할 경우
  • left_index=True, right_index=True : 인덱스를 키 값으로 병합
  • left_on, right_on 을 사용하거나, on을 사용하거나, left_index, right_index 를 사용하거나 ! => 셋 중 하나 선택하여 사용!

pd.concat([df1,df2])  # 데이터프레임 2개를 위아래로 병합
  • 주의 : 데이터프레임들을 리스트형태([])로 !!

6. 데이터 저장하기

df.to_excel('파일경로/파일명.xlsx', index=False)
df.to_csv('파일경로/파일명.csv', index=False)
  • index = True(기본값, 인덱스도 저장) | False(인덱스는 저장 안함)

7. 집계

df.pivot_table(index='컬럼명', columns='컬럼명', values='컬럼명', aggfunc = '함수')  # 피벗테이블 작성
	# 인덱스로 사용할 컬럼명(index)과 함수(aggfunc)를 적용할 컬럼명(values)을 지정하고 
    # 결과를 어떤 기준으로 구분하여 표시할 경우 칼럼명(columns)을 지정하여 피벗테이블 작성
    
df.isnull()    # NaN이면 True, 아니면 False 반환
df.fillna()  # 데이터프레임의 NaN에 대신 값을 대입
  • 사용 예시 : 이름 사용 빈도수 집계
    • 인덱스는 이름으로, 값은 등록된 수를 모두 더하여, 성별로 구분하여 피벗테이블 작성
      name = data.pivot_table(index='Name', values='Number', aggfunc='sum', columns='Sex')
      name = name.fillna(0) : NaN자리에 0을 대입하여 저장

8. 정렬하기

df.sort_values(by='컬럼명', ascending=False)
  • by = ‘칼럼명’ 또는 [’칼럼명1’, ‘칼럼명2’, …] : 정렬할 기준
    • 리스트로 정렬 기준 칼럼 여러개 지정 가능
  • ascending = True(기본값, 오름차순) | False(내림차순)
df[’칼럼명’].sort_index(ascending = False) : 칼럼을 인덱스를 기준으로 정렬
df[’칼럼명’].sort_values(ascending = False) : 칼럼을 값을 기준으로 정렬
  • df['컬럼명'] : 시리즈(Series)
    • 시리즈의 정렬은 2차원(행,열)이 아닌 1차원이므로 기준값(by) 지정할 필요 없음!

9. 컬럼별 데이터 종류 확인하기

df['칼럼명'].unique()                   # 칼럼의 고유값
df['칼러명'].value_counts(dropna=True)  # 칼럼의 각 고유값별 빈도수
  • dropna = True (기본값, null값 제외) | False (null값 포함)

10. 그 외

# groupby : 그룹화
df.groupby([’칼럼명1])[’칼럼명2].mean()  # 칼럼명1을 기준으로 그룹화하여, 칼럼명2의 평균을 구함
	# →결과는 칼럼명1이 인덱스, 칼럼명2의 평균이 값인 Series형태
# drop : 행/열 제거
df.drop(’칼럼명’, axis=1)  # 해당 칼럼 제거 (axis=0은 행 제거)
# sum/min/max 등 집계함수
df.sum(axis=0)  # 합계
	# axis=0 : 기본값, 각 칼럼별 모든 행의 데이터 합계
    # axis=1 : 각 인덱스별 모든 칼럼의 데이터 합계
  • df.sum(axis=1) ⇒ (df[’칼럼명1’] + df[’칼럼명2’] + …) 와 동일
# reset_index : 새로운 인덱스 지정
df.reset_index(drop=False) 
	# drop=False : 기본값, 기존 인덱스 안 버리고, 새로운 인덱스 지정
    # drop=True : 기존 인덱스 버리고, 새로운 인덱스 지정
# rename : 행/열 이름 변경
df.rename(columns = {’기존컬럼명‘ : ‘새로운컬럼명‘}) # 컬럼명 바꾸기
# astype : 데이터타입 변경
df.astype(타입)              # 한꺼번에 데이터타입 변경
df.astype({’컬럼명’:’타입’})  # 해당 컬럼 데이터타입 변경
# get_dummies : 원핫인코딩 (연속형을 범주형으로 변경)
df.get_dummies(data=df, columns=’범주형 칼럼명’) # 원핫인코딩
# 해당 컬럼이 문자열인 경우
df[’칼럼명’].str.replace(’기존문자열’, ‘새로운문자열’)  # ‘기존문자열’을 ‘새로운문자열’로 바꿈
df[’칼럼명’].str.slice(n, m)  # 문자열의 n번째자리부터 (m-1)번째 자리까지 표시 (n,m은 0부터시작)
# 날짜형 관련 함수
pd.to_datetime(df[’칼럼명’])  # 칼럼 데이터타입을 데이트타임형(날짜형)으로 변형
df[’칼럼명’].dt.year[|month|day|weekday|weekofyear]  # 날짜의 년도[|월|일|요일|1년중몇번째주] 반환 (해당 컬럼이 날짜형인 경우 가능)
profile
개발, 분석 배운 내용 정리하기!

0개의 댓글