import pandas as pd
์ ํด์
= pandas ๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(๋ชจ๋)๋ฅผ ํธ์ถ(import) ํ๊ณ ๊ทธ ์ด๋ฆ์ pd ๋ก ์ค์ฌ์ ๋ช
๋ช
ํ๊ฒ ๋ค
์ฆ, pandas ๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด ๋ชจ๋ ํจ์๋ฅผ ๋ถ๋ฌ์ค๊ฒ ๋จ.
ํ์ง๋ง ๊ฐ๋์ฉ ์ฐ๋ฆฌ๋ from ์ผ๋ก ์์ํ๋ ๊ตฌ๋ฌธ์ ๋ง์ฃผํ๊ฒ ๋๋๋ฐ,
์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํน์ ํจ์๋ง ์ฌ์ฉํ๊ณ ์ถ์ ๋ ์ฌ์ฉ๋จ
from matplotlib.pyplot as plt
= matplotlib ์ pyplot ํจ์๋ง ๊ฐ์ ธ์ค๊ณ ์ด๋ฆ์ plt ๋ก ์ค์ฌ์ ๋ช
๋ช
ํ๊ฒ ๋ค
import pandas as pd (pandas ๋ 6 ๊ธ์๋ผ์ pd ๋ก ์ค์ฌ ๋ช
๋ น)
import numpy as np
import time
from matplotlib.pyplot as plt
์ฌ์ฉ ๋ชฉ์
์๋ก ๋ค๋ฅธ ์ฌ๋ฌ ๊ฐ์ง ์ ํ์ ๋ฐ์ดํฐ๋ฅผย ์๋ฆฌ์ฆ์ ๋ฐ์ดํฐ ํ๋ ์์ด๋ผ๋ ๊ณตํต์ ํฌ๋งท์ผ๋ก ์ ๋ฆฌํ์ฌ ์ฝ๊ณ ๋น ๋ฅธ ์ฐ์ฐ ๋ฐ ๋ถ์์ ์ํ ํจ์๋ฅผ ์ ๊ณตํ๊ธฐ ์ํจ!
์ฆ, json, html, csv, hdf5, sql ๋ชจ๋ DataFrame์ผ๋ก ํต์ผํด์ ํํํ ์ ์์. ๐
๋ฐ์ดํฐ ํ๋ ์
ํต๊ณ์ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ด ๋๋(์คํ๋ ๋์ํธ์ ๊ฐ์) ํ
์ด๋ธ ํํ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ
-> ๊ธฐ๋ณธ์ ์ผ๋ก ํ๊ณผ ์ด๋ก ๊ตฌ์ฑ๋ ์ด์ฐจ์์ ํ๋ ฌ์ ๋ปํจ
๋ฐ์ดํฐํ๋ ์์ด๋, ํ์ด์ฌ ๋ฐ R ์์ ์ฌ์ฉํ๋ ํน์ ๋ฐ์ดํฐ ํฌ๋งท์.
๐ซต๐ป ๋์น๋ฉด ์ ๋ ๋ถ๋ถ! Series ์ ๊ฐ๋
-> Pandas Series๋ ํ ์ด๋ธ์ ์ด๊ณผ ๊ฐ์ผ๋ฉฐ, ๋ชจ๋ ์ ํ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ ํ๋ 1์ฐจ์ ๋ฐฐ์ด
๐
- CPU time: CPU ๊ฐ ์ฝ๋๋ฅผ ์คํํ๋๋ฐ ๊ฑธ๋ฆฐ ์๊ฐ
- Wall clock time ์ ์ค์ ์ฝ๋๋ฅผ ์คํํ๋ ๋ฐ ๊ฑธ๋ฆฐ ์๊ฐ
- %time ๋ค์ ๋์ค๋ ํ์ค ์ปค๋งจ๋ ์์์๊ฐ
- %timeit ๋ค์ ๋์ค๋ ํ์ค ์ปค๋งจ๋ ๋ฐ๋ณต์ํํ (iteration) ํ๊ท ์์์๊ฐ
- %%time ๋ค์ ๋์ค๋ ์ ์ ์ฒด ์ํ ํ ์์์๊ฐ
- %%timeit ๋ค์ ๋์ค๋ ์ ์ ์ฒด ์ํ ํ ํ๊ท ์์์๊ฐ
%%time
sum=0
for x in range(10000000) :
sum=sum+x
print("1๋ถํฐ 1000๋ง๊น์ง ํฉ :",sum)
# pandas ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ csv ํ์ผ ์ฝ๊ธฐ
df = pd.read_csv("xxxx.csv")
# ํ
์ด๋ธ ํ์ธํ๊ธฐ
display(df, df2, df3)
# ์ฒ์ 5 ์ค๋ง ์ถ๋ ฅํ๊ธฐ
#df2.head()
# ๋ง์ง๋ง 5 ์ค๋ง ์ถ๋ ฅํ๊ธฐ
#df2.tail()
# ๊ฐ ํ
์ด๋ธ์ ํ(๊ฐ๋ก) ๊ธธ์ด ํ์
ํ๊ธฐ
len(df)
# shape: ํ
์ด๋ธ์ ํ๊ณผ ์ด์ ๊ฐฏ์๋ฅผ ๋ฐํ
df.shape
# dtypes: ํ
์ด๋ธ ๋ด ์ปฌ๋ผํ์
(๋ฌธ์ํ, ์ซ์ํ, ๋ฐฐ์ด ๋ฑ) ํ์ธ
df.dtypes
# columns: ํ
์ด๋ธ ๋ด ์ปฌ๋ผ ํ์ธ
df.columns
# values: ํ
์ด๋ธ ๋ด ๊ฐ ํ๋ค์ ๋ฐฐ์ด ํํ๋ก ํ์ธ
df.values
# ํ
์ด๋ธ ๊ธฐ๋ณธ ๊ตฌ์กฐ ํ๋์ ํ์ธํ๊ธฐ
df.info()
# ์ ์ฒด ํ ๊ฐฏ์, ํ๊ท , ํ์คํธ์ฐจ, ์ต์๊ฐ, ์ฌ๋ถ์์, ์ต๋๊ฐ ํ์ธ
df2.describe()
#์ปฌ๋ผ๋ณ๋ก ๊ฒฐ์ธก์น(๋ฐ์ดํฐ๊ฐ ์๋) ํ์ธํ๊ธฐ
df.isnull().sum()
# ํน์ ์ปฌ๋ผ 1๊ฐ ๊ฐ์ ธ์ค๊ธฐ
#๋ฐฉ๋ฒ1: ์์ฑ. ์ฌ์ฉ
df.Category
#๋ฐฉ๋ฒ2: [] ์ฐ์ฐ์ ์ฌ์ฉ
df['Category']
#๋ฐฉ๋ฒ3: iloc ์ฌ์ฉ
# : ์ ๋ชจ๋ ํ์ ๊ฐ์ ธ์ค๊ฒ ๋ค๋ ์๋ฏธ์ด๋ฉฐ dataframe ์ ์ธ๋ฑ์ค ๋ฒํธ 4๋ฒ(์นดํ
๊ณ ๋ฆฌ)์ปฌ๋ผ์ ๊ฐ์ ธ์ค๊ฒ ๋ค๋ ํฌ๋ฏธ
df.iloc[:,4]
# ํน์ ์ปฌ๋ผ ์ฌ๋ฌ๊ฐ ๊ฐ์ ธ์ค๊ธฐ
#๋ฐฉ๋ฒ1: [[]] ์ฐ์ฐ์ ์ฌ์ฉ
# []๋ฅผ ํ๋ ์ฌ์ฉํ๋ฉด ๊ฒฐ๊ณผ๊ฐ์ด series ํํ๋ก ๋ฐํ๋์ด key error ๊ฐ๋ฐ์๋๋ฉฐ, [[]] ๋ dataframe ์ผ๋ก ๋ฐํ๋์ด ์๋ฌ๊ฐ ๋์ง ์์ต๋๋ค.
df[['Category','Selling Price']]
#๋ฐฉ๋ฒ2: iloc ์ฌ์ฉ
# : ์ ๋ชจ๋ ํ์ ๊ฐ์ ธ์ค๊ฒ ๋ค๋ ์๋ฏธ์ด๋ฉฐ dataframe ์ ์ธ๋ฑ์ค ๋ฒํธ 4๋ฒ,7๋ฒ ์ปฌ๋ผ์ ๊ฐ์ ธ์ค๊ฒ ๋ค๋ ํฌ๋ฏธ
df.iloc[:,[4,7]]
# ํน์ ์ปฌ๋ผ ๋ฒ๋ฆฌ๊ธฐ
# axis=0 ์ ์ธ๋ฑ์ค ๊ธฐ์ค, 1์ ์ปฌ๋ผ ๊ธฐ์ค ์ญ์ ๋ฅผ ์๋ฏธ
# inplace=True ๋ ์๋ณธ์ ๋ณ๊ฒฝํ๊ฒ ๋ค๋ ์๋ฏธ, False ์ ๊ฒฝ์ฐ ์๋ณธํ
์ด๋ธ์ ๋ณ๊ฒฝ๋์ง ์์
df3.drop('Interaction type', axis=1, inplace=True)
# ์กฐ๊ฑด์ ๋ถํฉํ๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ1
# ์กฐ๊ฑด์ ๋ง์กฑํ๋ ํ์ ์ ์์ถ๋ ฅ ,์๋ ํ์ NaN ์ผ๋ก ๋ฐํ
df2.where(df2['Age']>50)
# ์กฐ๊ฑด์ ๋ถํฉํ๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ2
# true, false์ ๊ฐ๋
์ด ์๋ ์กฐ๊ฑด์ ๋ถํฉํ๋ ๋ฐ์ดํฐ๋ง ์ฌ๋ผ์ด์ฑํ์ฌ ๊ฐ์ ธ์ค๊ณ ์ถ์ ๋
# mask ๋ฉ์๋๋ก ๋ถ๋ฆฝ๋๋ค. ์ด๋ฆ์ ๋ฐ๋์ mask ์ผ ํ์๊ฐ ์์ต๋๋ค.
mask = ((df2['Age']>50) & (df2['Gender']=='Male'))
df2[mask]
# ์กฐ๊ฑด์ ๋ถํฉํ๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ3
# ๋ฐ์ดํฐํ๋ ์๋ช
[์กฐ๊ฑด] ์ ์ฌ์ฉํ๋ฉด ์กฐ๊ฑด์ ๋ง์กฑํ๋ ํ๋ง ํํฐ๋ง๋ฉ๋๋ค.
df2 = df2[df2['Age']>50]
# ์กฐ๊ฑด์ ๋ถํฉํ๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ4
# loc[]์ ํ์ฉํ ์กฐ๊ฑด ํํฐ๋ง
df2 = df2.loc[df2['Age']>50]
# ๋ฐ์ดํฐ ๊ทธ๋ฃจํ- ๊ธฐ์ค 1๊ฐ
df2.groupby('Gender')['Customer ID'].count()
# ๋ฐ์ดํฐ ๊ทธ๋ฃจํ- ๊ธฐ์ค ์ฌ๋ฌ๊ฐ
df2.groupby(['Gender','Location'])['Customer ID'].count()
# ๋ฐ์ดํฐ count ์ nunique(distinct, ์ค๋ณต์ ๊ฑฐ) ์ฐจ์ด
df2.groupby('Location')['Age'].count()
df2.groupby('Location')['Age'].nunique()
๐ ์ฃผ์์ต์ (ํ๋ผ๋ฏธํฐ ๋ผ๊ณ ๋ ๋ถ๋ฆ ๋๋ค.)
- on: ์กฐ๊ฑด ์ปฌ๋ผ์ด ํ๊ฐ์ธ์ง ์ฌ๋ฌ๊ฐ์ธ์ง
- how: ์ด๋ค ์กฐ์ธ ๋ฐฉ์์ ์ฌ์ฉํ ๊ฒ์ธ์ง (inner, outer, left, right)
- left on / right onย : ์ด๊ธฐ์ค ๋ณํฉ ์ ๊ธฐ์ค์ผ๋ก ํ ์ด์ ์์ธก ์ด๋ฆ์ด ๋ค๋ฅด๋ค๋ฉด, ๊ฐ๊ฐ ์ด๋ค ์ด์ ๊ธฐ์ค์ผ๋ก ํ ์ง ์ง์
- sort: ๋ณํฉ ํ ์ธ๋ฑ์ค ์ ๋ ฌ ์ฌ๋ถ (True/False)
- suffixes: ์ค๋ณต๋ ์ปฌ๋ผ ์ด๋ฆ์ ์ฒ๋ฆฌ
- indicator: True ๋ก ํ ๊ฒฝ์ฐ, ๋ง์ง๋ง ์ด์ ๋ณํฉ ์ ๋ณด๋ฅผ ์ถ๋ ฅํจ
# ์ปฌ๋ผ๋ช
์ด ๊ฐ์ ๊ฒฝ์ฐ์ ์์๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์ปฌ๋ผ๋ช
์ ์์๋ก ๋ณ๊ฒฝํด ์ค
df3['Customer ID']=df3['user id']
# ๊ธฐ๋ณธ ์์ฑ๊ตฌ๋ฌธ์ผ๋ก, ๋ํดํธ๊ฐ์ inner join
# ๊ณตํต์ปฌ๋ผ๊ฐ์ ํฉ์ณ์ ธ ํ๋์ ์ปฌ๋ผ์ผ๋ก ์ถ๋ ฅ
merge_df = pd.merge(df2,df3)
# ์ ์ฝ๋์ ๋์ผํ ๊ธฐ๋ฅ์
๋๋ค. on ์ ์ ์ฌ์ฉํ ์ ์์ด์.
merge_df = pd.merge(df2,df3, how='inner', on='Customer ID')
# ๊ณตํต์ปฌ๋ผ์ด 2๊ฐ ์ด์์ผ ๋
merge_df = pd.merge(df2, df3, how='inner', on=['๊ณตํต์ปฌ๋ผ1','๊ณตํต์ปฌ๋ผ2'])
# ๊ธฐ์ค์ด ์ด๋ฆ์ด ๋ค๋ฅผ ๋
merge_df = pd.merge(df2,df3, how='inner', left_on = 'Customer ID', right_on = 'user id')
# ๊ณตํต์ปฌ๋ผ์ ๊ฐ๋ณ๋ก ์ถ๋ ฅํ๊ณ ์ถ์ ๋
merge_df = pd.merge(df2,df3, how='inner', on='Customer ID', suffixes=('_left','_rihgt'))
๐ ์ฃผ์์ต์
- how: ์ด๋ค ์กฐ์ธ ๋ฐฉ์์ ์ฌ์ฉํ ๊ฒ์ธ์ง (inner, outer, left, right)
- lsuffix / rsuffix: ์ด๋ฆ์ด ๊ฐ์ ์ปฌ๋ผ์ด ์์ ๊ฒฝ์ฐ, ๋ฌธ์์ด ์ง์ ํ์ฌ ๋ถ์ฌ
- sort: ์ธ๋ฑ์ค ์ ๋ ฌ์ฌ๋ถ (True / False)
# ๋จ์ ์กฐ์ธ
df2.join(df3)
# join ๋ฐฉ์ ์ค์
df2.join(df3, how='right')
# join์ ์ด๋ฆ์ด ๊ฐ์ ์ปฌ๋ผ์ด ์์ ๊ฒฝ์ฐ, ์ต์
์ผ๋ก ์ค์ ํ์ฌ ์กฐ์ธ ๊ฐ๋ฅ
# ์๋ ์ฝ๋๋ ์ค๋ฅ๊ฐ ๋จ
# df.join(df2)
df.join(df2,how='left', lsuffix='1', rsuffix='2')
# join ์ดํ, ์ธ๋ฑ์ค ์ ๋ ฌํ๊ธฐ
df.join(df2,how='left', lsuffix='1', rsuffix='2', sort=True)
๐ ์ฃผ์์ต์
- axis: ์์ง๊ฒฐํฉ์ธ์ง, ์ํ๊ฒฐํฉ์ธ์ง (axis=0: ์์ง๊ฒฐํฉ(๊ธฐ๋ณธ๊ฐ) / axis=1: ์ํ๊ฒฐํฉ)
- join: ์ด๋ค ์กฐ์ธ ๋ฐฉ์์ ์ฌ์ฉํ ๊ฒ์ธ์ง (inner, outer, left, right)
- join_axesย : ์กฐ์ธ ์ถ ์ง์
- keys: ๋ฐ์ดํฐํ๋ ์ ์ถ์ด๋ฆ ์ง์
- ignore_index=True : ์ธ๋ฑ์ค ์ฌ๋ฐฐ์ด
# ๊ธฐ๋ณธ ์์ฑ๊ตฌ๋ฌธ
pd.concat([df2, df3])
# ์ธ๋ก๋ก ๊ฒฐํฉ
pd.concat([df2, df3], axis=0, ignore_index=True, join='inner')
# ๊ฐ๋ก๋ก ๊ฒฐํฉ
pd.concat([df2, df3], axis=1, ignore_index=True, join='inner')
pandas ์ ํจ์ ์ค ํ๋. ๋ฐ์ดํฐํ๋ ์์ ํ์ ์ถ๊ฐํ๋ ๋ฉ์๋๋ก, ๋ ๋ฐ์ดํฐํ๋ ์์ ํ ๊ธฐ์ค์ผ๋ก ๊ฒฐํฉ
๐ ์ฃผ์์ต์
- ignore_index: ๊ธฐ์กด ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ง ์ฌ๋ถ. False๋ก ํ ๊ฒฝ์ฐ 0,1,2,..,n ์ด ๋ถ์ฌ
- sortย : ์ด์ ์ฌ์ ์ ์ผ๋ก ์ ๋ ฌํ ์ง ์ฌ๋ถ
# ๊ธฐ๋ฅ์ด ์์ด์ง ์์ ์ผ๋ก ์๋์ ๊ฐ์ด concat ์ผ๋ก ๋ณ๊ฒฝํ์ฌ ์คํํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
# ์๋ฌ๊ฐ ์๋ ๊ฒฝ๊ณ ๋ฉ์์ง๋ก, ์ด๋ฅผ ๋ฌด์ํ๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ ์ฝ๋๋ฅผ ์
๋ ฅํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
# import warnings
# warnings.filterwarnings('ignore')
# ๋จ์ ๊ฒฐํฉ, ์๋ ๊ฑด NaN์ผ๋ก ์ฒ๋ฆฌ๋๊ณ ๊ฒฐํฉ
# df2 ๊ฐ df ์ ์๋๋ก ๋ถ์
df.append(df2)
-> ๋ฐ์ดํฐ ๊ฐ๊ณต ๋ฐ ์๊ฐํ๋ฅผ ์ํด, ๋ฐ์ดํฐํ๋ ์์ ์์ ๋กญ๊ฒ ๋ณํํ๋ pivot table ์ ํ์๐
๐ ์ฃผ์์ต์
- index: ์ธ๋ฑ์ค(์ถ) ์ผ๋ก ์ฌ์ฉ๋ ์ด
- columns: ์ด๋ก ์ฌ์ฉ๋ ์ด
- values: ๊ฐ์ผ๋ก ์ฌ์ฉ๋ ์ด
- โญ index ๋ฐ columns์ ๋ฆฌ์คํธ ํํ๋ฅผ ์ ๋ ฅํ ๊ฒฝ์ฐ โ ๋ฉํฐ ์ธ๋ฑ์ค ๊ธฐ๋ฐ ํผ๋ฒํ ์ด๋ธ์ด ์์ฑ
- โญ values ์ ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฅ ํ ๊ฒฝ์ฐ โ ๊ฐ ๊ฐ์ ๋ํ ํ ์ด๋ธ์ด ์ฐ์์ ์ผ๋ก ์์ฑ
- โญ aggfunc: ์ด๋ ํ ๊ณ์ฐ์ ํ ์ง
- fill_value: NaN ๊ฐ์ ์ฒ๋ฆฌํ๊ณ ์ถ์ ๋ ์ฌ์ฉ, fill_value=0 ์ด ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋จ
- dropna: ๊ฒฐ์ธก์น(na)์ญ์ ์ฌ๋ถ ๊ฒฐ์
- sort: index or columns ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ
# age ๋ผ๋ ์ถ์ ๊ธฐ์ค์ผ๋ก ์นดํ
๊ณ ๋ฆฌ๋ณ ๊ณ ๊ฐid ์นด์ดํธ
pd.pivot_table(df2, index='Age', columns='Category', values='Customer ID', aggfunc='count')
# age, Category ๋ผ๋ ์ถ์ ๊ธฐ์ค์ผ๋ก ์ฑ๋ณ Previous Purchases ์ต์, ์ต๋๊ฐ ๊ตฌํ๊ธฐ
pd.pivot_table(df2, index=['Age','Category'],columns='Gender', values='Previous Purchases', aggfunc=['min','max'])
# ์ฑ๋ณ์ ์ถ์ผ๋ก ํ๊ณ , ์ฌ์ด์ฆ, ๋์ด๋ณ ๊ณ ๊ฐid ๊ณ ์ ํ๊ฒ ์นด์ดํธ
pd.pivot_table(df2, index=['Gender'],columns=['Size','Age'], values='Customer ID', aggfunc='nunique')
ํจ์ vs ๋ฉ์๋
ํจ์ : str(), int() ๊ฐ์ ๋ ๋ฆฝ์ ์ธ ์์ด๋ค
๋ฉ์๋ : df.split(), df.append() ์ ๊ฐ์ด ๊ฐ์ฒด ์ข ์์ ์ธ ์์ด๋ค (. ํ์)
# lambda ํจ์๋ฅผ ์ด์ฉํ ํ์ ์ถ๋ ฅํ๊ธฐ
mylist = [1, 2, 3, 4, 5]
mylist2 = list(filter(lambda x: x % 2 == 1, mylist))
print(mylist2)
# lambda ํจ์๋ฅผ ์ด์ฉํ ์ ๋ ฌ
mylist = ['apple', 'banana', 'cherry']
mylist2 = sorted(mylist, key=lambda x: len(x))
print(mylist2)
๐ ์ฃผ์์ต์
- sep: ๋ฌธ์์ด์ ๋๋ ๊ตฌ๋ถ์ ๊ธฐ์
- maxsplit: ์ต๋ split ํ์ (๋ํดํธ: ๋ชจ๋ ๋ค ๋๋)
# ์์ ๋ฌธ์์ด ์ ์ธ
s = "aa.bb.cc.dd.ee.ff.gg"
# '.' ๊ตฌ๋ถ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋๋
# ์๋ ๋ ์ฝ๋ ๊ฒฐ๊ณผ ๋์ผ
s.split('.')
s.split(sep='.')
# df ์ x ์ปฌ๋ผ์ถ๊ฐ
df2['x']="aa.bb.cc.dd.ee.ff.gg"
# '.' ๊ตฌ๋ถ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋๋๊ณ ์ปฌ๋ผ์ผ๋ก ๋ฐ์
# lambda ํจ์์ ๊ฒฐํฉํ์ฌ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
# 7๋ฒ ๋ฐ๋ณต, a ๋ฅผ ์ปฌ๋ผ ๊ตฌ๋ถ์๋ก ๋ฐ์์ฃผ๊ณ , format ํจ์๋ฅผ ํตํด a0, a1, a2 ... ๋ก ํ๊ธฐ
# lambda ํจ์๋ฅผ ํตํด '.' ๋ก ๊ตฌ๋ถ. ๋จ, len(x.split('.') ์ฆ 7 ๋ณด๋ค i ๊ฐ ์์ ๋ ์ํ
# ์ค์
for i in range(i):
df2["a{}".format(i)] = df2['x'].apply(lambda x: x.split('.')[i] if len(x.split('.'))>i else None)
๐ ์ฃผ์์ต์
- freqย : ๋ฐ๋ณต ์ฃผ๊ธฐ๋ฅผ ๋ํ๋ด๋ ํ๋ผ๋ฏธํฐ๋ก, SECONDLY, MINUTELY, HOURLY, DAILY, WEEKLY, MONTHLY, YEARLY
- dtstart: ๋ฐ๋ณต์ด ์์ํ๋ ๋ ์ง์ ์๊ฐ์ ๋ํ๋.
- interval: ์ฃผ๊ธฐ์ ์ผ๋ก ๋ฐ๋ณต๋๋ ๊ฐ๊ฒฉ์ ๋ํ๋.
- count: ์์ฑํ ๋ ์ง์ ์ต๋ ์๋ฅผ ๋ํ๋.
- until: ๋ฐ๋ณต์ด ๋๋๋ ๋ ์ง์ ์๊ฐ์ ๋ํ๋.
# ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ถ๋ฌ์ค๊ธฐ
from datetime import datetime
from dateutil.rrule import rrule, DAILY, TU
# ์์ ๋ ์ง, ์ข
๋ฃ๋ ์ง
start_date = datetime(2024, 2, 1)
end_date = datetime(2024, 3, 1)
# 2024-02-01 ๋ถํฐ 2024-03-01 ๊น์ง strf ์ฌ์ฉํ์ฌ ์ํ๋ ๋ฐ์ดํฐ ํ์์ผ๋ก ์ถ๋ ฅ.
weekly_rule = rrule(DAILY, dtstart=start_date, until=end_date)
for date in weekly_rule:
print(date.strftime('%Y-%m-%d'))
# ๋น ๋ฆฌ์คํธ ์์ฑ ํ ๋ ์ง๋ฅผ ๋ด์์ฃผ๊ธฐ
a=[]
for date in weekly_rule:
a.append(date.strftime('%Y-%m-%d'))
# 2023-02-01 ๋ถํฐ 2023-03-01 ๊น์ง strf ์ฌ์ฉํ์ฌ ์ํ๋ ๋ฐ์ดํฐ ํ์์ผ๋ก ์ถ๋ ฅ
weekly_rule = rrule(DAILY, dtstart=start_date, until=end_date)
# ๋ฐ์ดํฐํ๋ ์์์ ํน์ ๋ ์ง๊ธฐ๊ฐ์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ง ์ฌ๋ผ์ด์ฑ ํ๊ธฐ
# ๋น ๋ฆฌ์คํธ ์์ฑ ํ ๋ ์ง๋ฅผ ๋ด์์ฃผ๊ธฐ
a=[]
for date in weekly_rule:
a.append(date.strftime('%Y-%m-%d'))
# df3 ์ ์๋ ๋ ์ง ๋ฐ์ดํฐ๋ string
# string -> datetimd -> string ์ ํํ๋ก ๋ณํ
# ์์์ ๋ฐ์ ๋ฆฌ์คํธ์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ง ํํฐ๋งํ๊ธฐ ์ํจ
df3['Time stamp2'] = pd.to_datetime(df3['Time stamp']).dt.strftime('%Y-%m-%d')
mask =(df3['Time stamp2'].isin(a))
df3[mask]
# ์ปฌ๋ผ๋ณ ๊ฒฐ์ธก์น ์๋ณ
df3.isnull().sum()
# ๊ฒฐ์ธก์น ์ ๊ฑฐ1 - ์ด ์ ๊ฑฐํ๊ธฐ
df3 = df3.drop('Unnamed: 4', axis=1)
# ๊ฒฐ์ธก์น ์ ๊ฑฐ2 - ๊ฒฐ์ธก์น๊ฐ ์๋ ํ๋ค์ ๋ชจ๋ ์ ๊ฑฐ
df3.dropna()
# ๊ฐ์ ํํ
df3.dropna(axis=0, how='any')
# ๊ฒฐ์ธก์น ์ ๊ฑฐ3 - ๊ฒฐ์ธก์น๊ฐ ์๋ ์ด์ ๋ชจ๋ ์ ๊ฑฐ
# ์ด๋ก ์ ๊ฑฐํ๋ฉด ์ปฌ๋ผ์ด ์ ๊ฑฐ๋๋ ํ์์ด ๋ฐ์ํ๋ฏ๋ก ๋งค์ฐ ์ํํฉ๋๋ค.
# df3.dropna(axis=1)
# ๊ฒฐ์ธก์น ์ ๊ฑฐ4 - ์ ์ฒด ํ์ด ๊ฒฐ์ธก๊ฐ์ธ ๊ฒฝ์ฐ๋ง ์ญ์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ
# how='all'์ ์ฌ์ฉํด์ค๋๋ค.
df3.dropna(how='all')
# ๊ฒฐ์ธก์น ์ ๊ฑฐ5 - ๊ฒฐ์ธก์น ์ ๊ฑฐ ํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ก ์ ์ฅํ๊ณ ์ถ์ ๋
# inplace=True ์กฐ๊ฑด์ ๋ฃ์ด์ค๋๋ค.
df3.dropna(inplace=True)
# drop ์ดํ ๊ฒฐ์ธก์น๊ฐ ์ ์ ๊ฑฐ๋์๋์ง ์ฒดํฌ๊ฐ ํ์ํ๊ฒ ์ฃ ?
df3.isnull().sum()
# ๊ฒฐ์ธก์น ๋์ฒด: ์ต๋น๊ฐ
# mode ๋ ์ต๋น๊ฐ์ ์๋ฏธ
# df3 ์ Interaction type ์ปฌ๋ผ์ fillnaํจ์๋ฅผ ์ด์ฉํ์ฌ ์ฑ์์ฃผ๋, mode() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ต๋น๊ฐ์ผ๋ก ๋ฃ์ด์ค
# mode ํจ์๋ ์๋ฆฌ์ฆ๋ฅผ output์ผ๋ก ๊ฐ์ง๋๋ค.
# ๋ฐ๋ผ์,[0]์ ํตํด ์๋ฆฌ์ฆ ์ค ๋จ์ผ๊ฐ์ ๊ฐ์ ธ์์ผ ํฉ๋๋ค.
df3 = df3['Interaction type'].fillna(df3['Interaction type'].mode()[0])
# ๊ฒฐ์ธก์น ๋์ฒด: ํ๊ท ๊ฐ
df['sw'] = df['sw'].fillna(df['sw'].mean())
df.isnull().sum()
# ๊ฒฐ์ธก์น ๋์ฒด: ์ค๊ฐ๊ฐ
# inplace=True ๋ก ํ๋ฉด ์๋ณธ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋๊ฒ ๋ฉ๋๋ค.
df['sw'] = df['sw'].fillna(df['sw'].median())
df.isnull().sum()
# ๊ฒฐ์ธก์น ๋์ฒด: ๋ฐ๋ก ์ ๊ฐ์ผ๋ก ๋์ฒด
df['sw'] = df['sw'].fillna(method='ffill')
df.isnull().sum()
# ๊ฒฐ์ธก์น ๋์ฒด: ๋ฐ๋ก ์๋ ๊ฐ์ผ๋ก ๋์ฒด
df['sw'] = df['sw'].fillna(method='bfill')
#df.isnull().sum()
# ๊ฒฐ์ธก์น ๋์ฒด: group by ๊ฐ์ผ๋ก ๋์ฒด
# ์ฌ์ ๋ฐ์ดํฐ ํ์ธ
df.groupby('Is Amazon Seller')['sw'].median()
# group byํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐํ๋ ์์ ์ปฌ๋ผ์ผ๋ก ์ถ๊ฐํ๊ธฐ ์ํด
# transform ํจ์ ์ฌ์ฉ
df['sw'] = df['sw'].fillna(df.groupby('Is Amazon Seller')['sw'].transform('median'))
df.isnull().sum()
๊ฐ ๋ฐ์ดํฐ(ํ) ๋ง๋ค Z-score ๋ฅผ ๊ตฌํจ-> Z ๊ฐ์ X์์ ํ๊ท ์ ๋บ ๋ฐ์ดํฐ๋ฅผ ํ์คํธ์ฐจ๋ก ๋๋ ๊ฐ์ด๋ฉฐ, ํ์ค ์ ์๋ผ๊ณ ๋ถ๋ฆ -> ์ผ๋ฐ์ ์ผ๋ก -3์์ 3 ์ฌ์ด์ ๊ฐ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ยฑ3 ์ด์์ด๋ฉด ์ด์์น๋ก ๊ฐ์ฃผ
- Z-Score : 0 ํด๋น ๋ฐ์ดํฐ๋ ํ๊ท ๊ณผ ๊ฐ์์ ์๋ฏธ (=ํ๊ท ์์ ๋จ์ด์ง ๊ฑฐ๋ฆฌ๊ฐ 0)
- Z-Score > 0 : ํด๋น ๋ฐ์ดํฐ ํ๊ท ๋ณด๋ค ํผ. Z-Score๊ฐ 1์ด๋ฉด, ํด๋น ๋ฐ์ดํฐ ํฌ์ธํธ๋ ํ๊ท ๋ณด๋ค 1 ํ์คํธ์ฐจ๋งํผ ๋ ํฐ ๊ฐ์์ ์๋ฏธ
- Z-Score < 0 : ํด๋น ๋ฐ์ดํฐ๋ ํ๊ท ๋ณด๋ค ์์. Z-Score๊ฐ -1์ด๋ฉด, ํด๋น ๋ฐ์ดํฐ ํฌ์ธํธ๋ ํ๊ท ๋ณด๋ค 1 ํ์คํธ์ฐจ๋งํผ ๋ ์์์ ์๋ฏธ
# df ์ Shipping Weight๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ค์ํ ์ด์์น ๊ฐ์ง ๊ธฐ๋ฒ์ ์ ์ฉ
df = pd.read_csv("p.csv")
# string -> float -> int
df['sw'] = df['Shipping Weight'].str.split().str[0]
df['sw'] = pd.to_numeric(df['sw'] , errors='coerce').fillna(0.0).astype(int)
# z-score ๋ฅผ ์ ์ฉํ ์ปฌ๋ผ ์ ์
df1 = df[['sw']]
# ํ์คํ ์งํ
# ํ์คํ : ํ๊ท ์ 0์ผ๋ก, ํ์ค ํธ์ฐจ๋ฅผ 1๋ก
# ๋ฐ์ดํฐ๋ฅผ 0์ ์ค์ฌ์ผ๋ก ์์ชฝ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถํฌ์ํค๋ ๋ฐฉ๋ฒ
# ํ์คํ๋ฅผ ํ๊ฒ ๋๋ฉด ๊ฐ ๋ฐ์ดํฐ๋ค์ ํ๊ท ์ ๊ธฐ์ค์ผ๋ก ์ผ๋ง๋ ๋จ์ฌ์ ธ ์๋์ง๋ฅผ ๋ํ๋ด๋ ๊ฐ์ผ๋ก ๋ณํ
scale_df = StandardScaler().fit_transform(df1)
merge_df = pd.concat([df1, pd.DataFrame(StandardScaler().fit_transform(df1))],axis=1)
merge_df.columns = ['Shipping Weight', 'zscore']
# ์ด์์น ๊ฐ์ง
# Z-SCORE ๊ธฐ๋ฐ, -3 ๋ณด๋ค ์๊ฑฐ๋ 3๋ณด๋ค ํฐ ๊ฒฝ์ฐ๋ฅผ ์ด์์น๋ก ํ๋ณ
mask = ((merge_df['zscore']<-3) | (merge_df['zscore']>3))
# mask ๋ฉ์๋ ์ฌ์ฉ
strange_df = merge_df[mask]
strange_df.count()
๋ฐ์ดํฐ์ 25% ์ง์ ()๊ณผ 75% ์ง์ () ์ฌ์ด์ ๋ฒ์()๋ฅผ ์ฌ์ฉ -> ์ด๋ฅผ ๋ฒ์ด๋๋ ๊ฐ๋ค์ ๋ชจ๋ ์ด์์น๋ก ๊ฐ์ฃผ
IQR : (์ 3์ฌ๋ถ์ ๊ฐ) - (์ 1์ฌ๋ถ์ ๊ฐ)
# df ์ Shipping Weight๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ค์ํ ์ด์์น ๊ฐ์ง ๊ธฐ๋ฒ์ ์ ์ฉ
df = pd.read_csv("p.csv")
# string -> float -> int
df['sw'] = df['Shipping Weight'].str.split().str[0]
df['sw'] = pd.to_numeric(df['sw'] , errors='coerce').fillna(0.0).astype(int)
# ์ด์์น๋ฅผ ๊ฐ์งํ ์ปฌ๋ผ ์ ์
df1 = df[['sw']]
# Q3, Q1, IQR ๊ฐ ๊ตฌํ๊ธฐ
# ๋ฐฑ๋ถ์์๋ฅผ ๊ตฌํด์ฃผ๋ quantile ํจ์๋ฅผ ์ ์ฉํ์ฌ ์ฝ๊ฒ ๊ตฌํ ์ ์์
# ๋ฐ์ดํฐํ๋ ์ ์ ์ฒด ํน์ ํน์ ์ด์ ๋ํ์ฌ ๋ชจ๋ ์ ์ฉ์ด ๊ฐ๋ฅ
q3 = df1['sw'].quantile(0.75)
q1 = df1['sw'].quantile(0.25)
iqr = q3 - q1
q3, q1, iqr
# ์ด์์น ํ๋ณ ๋ฐ dataframe ์ ์ฅ
# Q3 : 100๊ฐ์ ๋ฐ์ดํฐ๋ก ๊ฐ์ ์, 25๋ฒ์งธ๋ก ๋์ ๊ฐ์ ํด๋น
# Q1 : 100๊ฐ์ ๋ฐ์ดํฐ๋ก ๊ฐ์ ์, 75๋ฒ์งธ๋ก ๋์ ๊ฐ์ ํด๋น
# IQR : Q3 - Q1์ ์ฐจ์ด๋ฅผ ์๋ฏธํฉ๋๋ค.
# ์ด์์น : Q3 + 1.5 * IQR๋ณด๋ค ๋๊ฑฐ๋ Q1 - 1.5 * IQR๋ณด๋ค ๋ฎ์ ๊ฐ์ ์๋ฏธ
def is_outlier(df1):
score = df1['sw']
if score > 7 + (1.5 * 6) or score < 1 - (1.5 * 6):
return '์ด์์น'
else:
return '์ด์์น์๋'
# apply ํจ์๋ฅผ ํตํ์ฌ ๊ฐ ๊ฐ์ ์ด์์น ์ฌ๋ถ๋ฅผ ์ฐพ๊ณ ์๋ก์ด ์ด์ ๊ฒฐ๊ณผ ์ ์ฅ
df1['์ด์์น์ฌ๋ถ'] = df1.apply(is_outlier, axis = 1) # axis = 1 ์ง์ ํ์
# IQR ๋ฐฉ์์ผ๋ก ๊ตฌํ ์ด์์น ๊ฐ์๋ 349 ๊ฐ
df1.groupby('์ด์์น์ฌ๋ถ').count()
๋ฐ์ดํฐ์ ์ ๊ฒฐ์ ํธ๋ฆฌ ํํ๋ก ํํ
ํ์ง๋ง ์ด์์น์ ๊ฒฝ์ฐ, ์ด ์ด๋์๋ ์ํ์ง ์์ ํ๋ฅ ์ด ๋์ ๊ตฌ๋ถ๋์ง ์์
-> ํ ๋ฒ ๋ถ๋ฆฌ๋ ๋ ๋ง๋ค ๊ฒฝ๋ก ๊ธธ์ด๊ฐ ๋ถ์ฌ๋๋ฉฐ, ํธ๋ฆฌ์์ ๋ช ๋ฒ์ ๋ถ๋ฆฌํด์ผ ํ๋์ง (๋ฐ์ดํฐ๊น์ง์ ๊ฒฝ๋ก ๊ธธ์ด)๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์ด์์น์ธ์ง ์๋์ง๋ฅผ ํ๋จ
-> ๋ค๋ฅธ ๊ด์ธก์น์ ๋นํดย ์งง์ ๊ฒฝ๋ก ๊ธธ์ด์ ๋ฐ์ดํฐ = ์ด์์น
- ๊ฒฝ๋ก ๊ธธ์ด๋ก ์ ์๋ 0 ์์ 1 ์ฌ์ด๋ก ์ฐ์ถ๋๋ฉฐ, ๊ฒฐ๊ณผ๊ฐ 1 ์ ๊ฐ๊น์ธ์๋ก ์ด์์น๋ก ๊ฐ์ฃผ
๊ฐ ๋ฐ์ดํฐ์ ๋ฐ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฐ์ง์ ํ์ฑ์ํค๊ณ , ์ค์ ๋ ๊ฑฐ๋ฆฌ ๋ด์ ์ค์ ๋ ์ต์ ๊ฐ์์ ๋ค๋ฅธ ํฌ์ธํธ๊ฐ ์์ ๊ฒฝ์ฐ, ํด๋น ํฌ์ธํธ๋ ํต์ฌ ํฌ์ธํธ๋ก ๊ฐ์ฃผ
-> ํต์ฌ ํฌ์ธํธ๋ค์ด ์๋ก ์ฐ๊ฒฐ๋์ด ๊ตฐ์ง์ ํ์ฑํ๋ฉฐ, ์ด์ ์ฐ๊ฒฐ๋์ง ์์ ํฌ์ธํธ๋ ์ด์์น๋ก ๋ถ๋ฅ
# ๊ธฐ๋ณธ ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
df2.groupby('Gender')['Customer ID'].count().plot.bar()
# ์ปฌ๋ฌ ์ง์
df2.groupby('Gender')['Customer ID'].count().plot.bar(color=['yellow','purple'])
<์ฃผ์ ์ง์ ์ต์ >
<์ฌ๋ฌ ๊ฐ์ ๊ทธ๋ํ ๋์์ ๊ทธ๋ฆฌ๊ธฐ>
<์ฃผ์ ์ง์ ๊ทธ๋ํ>
๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ค๋ฅด๊ฒ, ๋ฌธ๋ฒ์ ์์๊ฐ ๊ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๊ฐ์ฅ ํฐ ์ฅ์ ์ ๋์ ๊ทธ๋ํ ๊ตฌํ!!!!
<์ฃผ์ ๋ฌธ๋ฒ>
pygWalker
๊ฐ๋จํ ์ค์น๋ก EDA ๊ฐ๋ฅ
๊ฐํธํ๊ฒ ๊ทธ๋ฆฐ ๊ทธ๋ํ๋ฅผ ๋ฐ๋ก PNG FILE๋ก ๋ด๋ณด๋ด๊ธฐ ๊ฐ๋ฅ