Pandas
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
기존 데이터 형태가 다음과 같다고 하자.
data.melt('religion', var_name='scope', value_name='sum')
melt를 사용하면 기존의 wide 포맷 데이터를 long 포맷 데이터로 바꿀 수 있다. melt 적용 결과는 다음과 같다.
(2) stack
다른 데이터를 가지고 melt를 적용한 결과가 다음과 같았다고 하자.
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()
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