pandas의 모든 것
🐼

pandas의 모든 것

Tags
Python
Data
Published
May 2, 2023
Author
유레미 EUREMI
회사에서 데이터분석 업무를 함께 하면서 pandas를 활용해 다양한 데이터 처리를 해보았다. 그 중에서 자주 사용하는 것들 위주로 공유해보려한다.

read_csv, to_csv

파일을 dataframe으로 변환하는 데는 여러가지 방법이 있지만 excel과 csv 파일을 불러올 수 있다. excel 파일일 때 보통 csv 파일로 변환 후 data를 read한다. 이 부분만 보면 csv 파일이 용량이 더 작아서라고 생각할 수 있지만 실제론 excel 파일이 csv 파일보다 용량이 더 작다. 그럼에도 csv 파일을 사용하는 이유는 첫번째로 csv 파일은 plain text이며 주로 comma를 separate로 가지고 있다. excel 파일은 microsoft excel로 flexible하지 않다. 즉, 간단한 text editor로도 쉽게 열어볼 수 있다. 두번째는 memory 이슈이다. csv 파일은 적은 memory를 잡기 때문에 csv파일을 읽거나 저장할 때 더 빠르다.
python에서 csv 파일을 불러올 땐 read_csv를 사용한다. read_csv api에는 여러가지의 parameter들이 있지만 자주 사용하는 것은 아래와 같다.
import pandas as pd csv_filename = '/Users/rimiiii/csv파일위치/csv_filename' # 파일 불러오기 df = pd.read_csv(csv_filename)
  • sep: csv 파일의 seperator, 보통 comma(,)를 사용하지만 때에 따라 세미콜론(;)이나 tab(\t)을 사용하기도 한다.
  • header: column의 이름(header)를 지정할 수 있다. 예를 들어, 3번째 행이 열의 기준이 될 경우 header=2를 주면 된다.
  • index_col: header와 비슷한 역할이다. row의 index를 지정할 수 있다. 기본값은 None으로 index를 주지 않는다.
파일을 csv 파일로 저장할 땐 to_csv를 사용한다. to_csv에도 여러가지 parameter가 있지만 주요한 것들만 보자면 아래와 같다.
# 파일 저장하기 df.to_csv('저장할_파일_위치/저장할_파일이름.csv')
  • sep: csv 파일을 저장할 때 사용할 seperator이다. 기본값은 comma(,)이다.
  • header: header를 저장할지 정할 수 있다. 기본값은 True이며, False면 header를 쓰지 않고 list로 column이름을 지정해줄 수 있다.
  • index: index도 함께 저장할지 선택할 수 있다. 기본값은 True로 index를 함께 저장한다.
  • mode: csv 파일을 저장할 때 w, a를 선택할 수 있다. w의 경우, 파일을 만들어 저장하는 것이고 a의 경우 파일을 덮어씌울 수 있다. list.append와 비슷한 역할이다.

filtering

데이터분석에 있어 원하는 값들만 추출하거나 여러 통계지표를 추출하는 경우가 많다. 그때 유용한 함수로 filter가 있다. 아래와 같은 표가 있을 때 4000원 이상인 menu들만 가져오고 싶다면 df.price ≥ 4000을 사용할 수 있다. 결과는 행 별로 해당 연산자가 True라면 True, False라면 False를 내뱉는다. True에 해당하는 row만 뽑고 싶다면 df로 한번 감싸주면 된다.
df = pd.DataFrame({'menu': ['아이스아메리카노', '밀크티', '딸기라떼'], 'price': [3000, 4000, 5000]}) df.price >= 4000 #0 False#1 True#2 True#Name: price, dtype: bool df[df.price >= 4000]
notion image
만일 여러가지 filtering을 걸고 싶다면 &을 사용하면 된다. 예를 들어, 가격이 4000원 이상이고 딸기라떼란 menu를 가져오고 싶다면 아래와 같이 입력하면 된다. 여기서 괄호가 추가로 들어가는데 수학 연산과 비슷하다. 어느 부분을 먼저 계산할지 알려주는 역할을 한다.
df[(df.price >= 4000) & (df.menu == '딸기라떼')]
notion image
이외에도 isin이 있다. 어떤 list에 속한 값들만 filtering하고 싶을 때 사용한다.
df[df.menu.isin(['딸기라떼', '아이스아메리카노'])]
notion image
또는 isna()를 이용하면 null값의 row만 추출해준다.
df = pd.DataFrame({'menu': ['아이스아메리카노', '밀크티', '딸기라떼', '녹차라뗴'], 'price': [3000, 4000, 5000, None]}) df[df.price.isna()]
우리가 추출하려는 필터링의 반대 row만 뽑기 위해선 ~(물결)을 이용하면 된다. 물결을 넣게 되면 True는 False, False는 True로 변환된다.
~df.price.isna() #0 True #1 True #2 True #3 False #Name: price, dtype: bool df[~df.price.isna()]

groupby

어떤 group의 평균값을 보고 싶다면 어떻게 해야할까? 그럴땐 groupby를 사용하면 된다. groupby는 굉장히 유용한 api이다. 깊게 알수록 유용하게 사용할 수 있다. 아래의 dataframe이 있을 때 shop 별로 가격의 평균을 계산하기 위해선 groupby(’shop_name’).mean()을 사용하면 된다. mean 이외에도 count, sum, var 등이 있다.
df = pd.DataFrame({'shop_name': ['A', 'A', 'A', 'A', 'B', 'B', 'B'], 'menu': ['아이스아메리카노', '밀크티', '딸기라떼', '녹차라뗴', '아이스아메리카노', '밀크티', '카페라떼'], 'price': [3000, 4000, 5000, 5500, 4000, 5000, 4500]}) df.groupby('shop_name').mean()
notion image

iloc

특정 행과 특정 열만 뽑아보고 싶을땐 list나 array는 바로 괄호를 이용해 특정 행 또는 열을 불러온다. dataframe은 iloc을 이용해야한다.
df.iloc[3] # 3번째 행에 있는 row 가져오기 df.iloc[3,2] #3번째 행, 2번째 열에 있는 값 가져오기 #shop_name A #menu 녹차라뗴 #price 5500 #Name: 3, dtype: object #5500

iterrows

dataframe을 for loop을 돌리기 위해선 iterrows를 사용한다. iterrows는 튜플로 내뱉는데 row의 index와 series 형태의 row를 뱉는다.
for idx, row in df.iterrows(): print(row['menu']) # 아이스아메리카노# 밀크티# 딸기라떼# 녹차라뗴# 아이스아메리카노# 밀크티# 카페라떼

apply

이 함수도 정말 유용하다. 특정 컬럼값들에 일괄적으로 어떤 함수를 사용하고 싶을때, 좀 더 복잡한 로직을 추가하고 싶을 때 apply를 쓸 수 있다. 하나의 컬럼 뿐만 아니라 여러 컬럼도 가능하다. Cython iterater를 기반이기 때문에 for loop보다 속도가 빠르다. 단, dataframe이 너무 클 경우에는 오버헤드가 발생할 수 있다.
df.menu.apply(lambda x: x.replace('아이스', '따뜻한')) # 0 따뜻한아메리카노# 1 밀크티# 2 딸기라떼# 3 녹차라뗴# 4 따뜻한아메리카노# 5 밀크티# 6 카페라떼# Name: menu, dtype: object
2개 이상의 컬럼을 함께 계산하고 싶을땐 axis를 추가해야한다. menu에 아이스가 들어가는 음료라면 price에 500원을 추가하여 새로운 컬럼에 넣고 싶다고 한다면 아래와 같이 구현하면 된다.
def add_ice_price(menu, price): return price+500 if '아이스' in menu else price df['new_price'] = df.apply(lambda x: add_ice_price(x.menu, x.price), axis=1) df
notion image

rename

특정 컬럼들의 이름을 바꾸고 싶을때 사용할 수 있다. 모든 컬럼을 소문자로 바꾸는 것도 가능하다. 딕셔너리 형태의 mapper를 이용한다.
df.rename(columns={'menu': '메뉴', 'price': '가격'}) df.rename(str.upper, axis='columns')
notion image
notion image