Pandas

2 minute read

1. DataFrame

  • 판다스 데이터프레임은 numpy로 만들어져 있다.
  • 따라서, .values 또는 .to_numpy()를 붙이면 넘파이 데이터포맷으로 바꿔줄 수 있다.

2. 판다스 데이터 타입

데이터타입 표현
정수형 int64
실수형 float64
문자열 object
카테고리 category
시계열 datetime64

3. EDA

EDA(Exploratory data analysis)를 통해 데이터에 대한 인사이트를 얻을 수 있다.

(1) 기초

데이터프레임에서 시리즈를 추출한 후 다음의 작업을 수행할 수 있다.

  • value_counts(): 분포 확인
  • describe(): boxplot으로 연결
    • describe는 같은 이름을 쓰더라도 데이터타입에 따라 하는 일이 다르다. (다형성)
    • boxplot을 보고 normalization 여부를 판단한다.

(2) pandas_profiling

자동으로 만들어진 EDA한 결과를 확인할 수 있다.

import pandas_profiling
pandas_profiling.ProfileReport(iris)

(3) 그래프 그리기

한 눈에 각 컬럼별 분포와 컬럼 간의 상관성을 확인할 수 있다.

# pandas scatter_matrix
pd.plotting.scatter_matrix(iris);

# seaborn pairplot
sns.pairplot(iris, hue='species')

상관관계를 표현하는 가장 최적의 그래프는 heatmap이다.

sns.heatmap(iris.corr(), annot=True)

4. 데이터 값 한 번에 변경하기

판다스에서는 map, applymap, apply를 사용해 데이터 값을 한 번에 변경할 수 있으며 각각 활용하는 경우에 있어서 방식의 차이가 있다.

특성 map applymap apply
자료구조 Series DataFrame Series / DataFrame
전달 인자 Function / Dictionary Function Function
import seaborn as sns
tips = sns.load_dataset('tips')

# map
tips.total_bill.map(lambda x:x+1)
tips.sex.map({'Female':0, 'Male':1}) # label encoding 쉽게 할 수 있음

# applymap
tips.select_dtypes(['float64', 'int64']).applymap(lambda x : x+1) 

# apply
tips.tip.apply(lambda x: x+1)
tips.select_dtypes('float64').apply(lambda x:x+1)

select_dtypes : 원하는 데이터 타입만 가져오기

map을 쓰지 않고도 라벨인코딩을 할 수 있다.

tips.smoker.cat.codes

Accessor 종류 : cat, str, dt

apply는 axis를 사용해 어느 방향으로 적용할지를 선택할 수 있다. 예를 들어, aixs=0이면 column이 하나씩 들어오며, axis=1이면 row가 하나씩 들어온다.

tips.apply(lambda x:x['tip']+x['size']*5, axis=1)

5. 이터레이션

  • .items or .iteritems: 하나의 튜플에 하나의 컬럼
  • .iterrows: 하나의 튜플에 하나의 row
  • .itertuples: named tuple. 가장 많이 쓴다.
for i in tips.itertuples():
    print(i)
Pandas(Index=0, total_bill=16.99, tip=1.01, sex='Female', smoker='No', day='Sun', time='Dinner', size=2)
...

6. Aggregation

(1) groupby

tips.groupby('sex').mean()
tips.groupby('sex').agg(['min', 'max'])

(2) pivot_table

tips.pivot_table('tip', 'sex', ['day', 'time'], margins=True, aggfunc='max')

(3) crosstab

pd.crosstab(tips.sex, tips.time) # 빈도

7. Tidy 데이터

  • 데이터를 유지, 보수, 변형이 쉬운 Tidy 데이터
  • 관계형 데이터베이스에서와 같은 형태로 관리하는 것
  • wide 포맷을 long 포맷으로 바꿔 Tidy 데이터로 만든다.
    • 판다스에서는 melt, stack, wide_to_long을 사용하면 된다.

(1) melt

기존 데이터 형태가 다음과 같다고 하자.

image

data.melt('religion', var_name='scope', value_name='sum')

melt를 사용하면 기존의 wide 포맷 데이터를 long 포맷 데이터로 바꿀 수 있다. melt 적용 결과는 다음과 같다.

image

(2) stack

다른 데이터를 가지고 melt를 적용한 결과가 다음과 같았다고 하자.

image

data2_.set_index('element').stack()

해당 데이터에 stack을 적용하였더니 다음과 같은 Series를 반환하였다. stack은 컬럼을 인덱스로 바꾼다.

element          
TMAX     id          MX000017004
         year               2010
         month                12
         variable             d1
         value               299
                        ...     
TMIN     id          MX000017004
         year               2010
         month                 8
         variable            d31
         value               154
Length: 330, dtype: object

unstack은 인덱스를 컬럼으로 바꾼다.

다음과 같은 recommendation 데이터가 있다고 하자.

  user id	item id	rating
0	196	 242	3
1	186   	302   	3
2	22    	377   	1
3	244   	51	2
4	166   	346   	1

user id와 item id 컬럼을 set_index를 사용해 인덱스로 가져올 수 있다.

recommendation.set_index(['user id', 'item id'])
                 rating
user id	item id	
196	      242     	3
186	      302     	3
22	      377     	1
244	      51  2
166	      346     	1
...	    ...	    ...

unstack을 사용하면 인덱스를 컬럼으로 펴 넣을 수 있다.

recommendation.set_index(['user id', 'item id']).unstack()

image

pivot을 이용해 위와 같은 결과를 보다 깔끔한 형태로 나타낼 수도 있다.

recommendation.pivot(index='user id', columns='item id', values='rating')

8. missingno

missingno 라이브러리를 활용해 결측치를 쉽게 확인해볼 수 있다.

!pip install missingno

import missingno as mino

mino.matrix(data)

Leave a comment