!pip install pandas==1.5.3
import pandas as pd
pd.__version__
โ
pd.Series([90, 80], index=['Julie', 'Tom'])
# 12x4 ํ๋ ฌ์ 1๋ถํฐ 48๊น์ง์ ์ซ์๋ฅผ ์์๋ฅผ ๊ฐ์ง๊ณ ,
# index๋ 2023-08-01๋ถํฐ ์์ํ๊ณ ,
# coulmns์ ์์๋๋ก X1, X2, X3, X4๋ก ํ๋ DataFrame ์์ฑ
df = pd.DataFrame(data=np.arange(1, 49).reshape(12, 4),
index=pd.date_range(start='20230801',
end='20230812', freq='D'),
columns=["X1", "X2", "X3", "X4"])
DataFrame์ ๊ฒฝ์ฐ
- key : columns๋ช
- value : columns์ ๊ฐ ๋ด์ ๋ฆฌ์คํธ ๋๋ numpy array ๋๋ series
dict_data = {'name':['Tom', 'Julie'], 'score':[50, 80]}
df = pd.DataFrame(dict_data)
Series์ ๊ฒฝ์ฐ
- key : index
- value : index์ ๋งค์นญ๋๋ ๋ฐ์ดํฐ ๊ฐ
dict_data = {'a':1,'b':2,'c':3}
series_data = pd.Series(dict_data)
list1 = [{'name':'Tom', 'score':50}, {'name':'Julie', 'score':80}]
โ
- ๋ฐ์ดํฐ ์ ์ถ๋ ฅ ํจ์
- [pandas] read_csv
: csvํ์ผ์ ๋ฐ์ดํฐํ๋ ์์ผ๋ก ๋ถ๋ฌ์ค๋ ํจ์
โ
- filepath_or_buffer
: ํ์ผ์ ๊ฒฝ๋ก๋ช
โ
- sep (์ธ์๋ ๋ฌธ์์ด / ๊ธฐ๋ณธ๊ฐ์ ',')
: ๊ตฌ๋ถ์๋ฅผ ์ง์ ํ๋ ์ธ์
โ
- header (์ธ์๋ ์ ์, ์ ์์ ๋ฆฌ์คํธ / ๊ธฐ๋ณธ๊ฐ์ 'infer')
: columns๋ฅผ ์ง์ ํ๋ ์ธ์์ง์ ํ์ง ์์ผ๋ฉด ๋๋ถ๋ถ ๋งจ ์์ค์ด columns๊ฐ ๋๋ค.(๊ธฐ๋ณธ ๊ฐ์ด 0์ธ๊ฒ๊ณผ ๋น์ทํ๋ค) ๋ฆฌ์คํธ๋ก ์ง์ ํ๋ฉด ๋ฉํฐ ์ธ๋ฑ์ค์ธ columns๊ฐ ๋๋ค.
โ
- index_col (์ธ์๋ ์ ์, ์ ์์ ๋ฆฌ์คํธ / ๊ธฐ๋ณธ๊ฐ์ None)
: index๋ฅผ ์ง์ ํ๋ ์ธ์์ง์ ํ์ง ์์ผ๋ฉด RangeIndex๊ฐ index๋ก ๋ถ์ฌ๋๋ค. ๋ฆฌ์คํธ๋ก ์ง์ ํ๋ฉด ๋ฉํฐ ์ธ๋ฑ์ค์ธ index๊ฐ ๋๋ค.
โ
- nrows(์ธ์๋ ์ ์, ๊ธฐ๋ณธ๊ฐ์ ์ ๋ถ)
: ๋ถ๋ฌ์ค๋ ํ์ ์๋ฅผ ์ง์ ํ๋ ์ธ์
โ
- usecols(์ธ์๋ ์ปฌ๋ฌ๋ช์ ๋ด์ ๋ฆฌ์คํธ)
: ๋ถ๋ฌ์ค๋ ์ปฌ๋ผ๋ช ์ ์ง์ ํ๋ ์ธ์pd.read_csv('test.csv', header=None, index_col=0) # csvํ์ผ ๋ถ๋ฌ์ DataFrame ๋ฆฌํด df.to_csv('titanic.csv') # DataFrame์ csv ํ์ผ๋ก ์ ์ฅ
๐ฅ TIP) ๋์ฉ๋ ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
# 1. nrows ๋งค๊ฐ๋ณ์๋ฅผ ํ์ฉํ์ฌ ์ผ๋ถ์ ๋ฐ์ดํฐ๋ง ๋ถ์ด์ ํ์ํ ์ปฌ๋ผ ํ์ธ pd.read_csv(url, nrows=2) โ # 2. usecols ๋งค๊ฐ๋ณ์๋ฅผ ํ์ฉํ์ฌ ํ์ํ ์ปฌ๋ผ๋ง ๋ถ์ด์ ์ฌ์ฉํ๊ธฐ pd.read_csv(url, usecols=['title', 'author'])
- [pandas] read_excel
: ์์ ํ์ผ์ ๋ฐ์ดํฐํ๋ ์์ผ๋ก ๋ถ๋ฌ์ค๋ ํจ์
- io
: ํ์ผ์ ๊ฒฝ๋ก๋ช
โ
- sheet_name(์ธ์๋ ๋ฌธ์์ด, ์ ์, ๋ฆฌ์คํธ / ๊ธฐ๋ณธ๊ฐ์ 0)
: ๋ถ๋ฌ ์ฌ ์ํธ ์ง์ ํ๋ ์ธ์์) - ์ง์ ํ์ง ์์ ๋: ์ฒซ๋ฒ์งธ ์ํธ๋ฅผ ๋ถ๋ฌ์จ๋ค - 1: 2๋ฒ์งธ ์ํธ๋ฅผ ๋ถ๋ฌ์จ๋ค - "Sheet1": ๋ฌธ์์ด์ ์ ๋ ฅํ๋ฉด ํด๋น ์ด๋ฆ์ ๊ฐ์ง ์ํธ๋ฅผ ๋ถ๋ฌ์จ๋ค. ์ฌ๊ธฐ์๋ "Sheet1"์ด๋ผ๋ ์ด๋ฆ์ ์ํธ๋ฅผ ๋ถ๋ฌ์จ๋ค - [0, 1, "Sheet5"]: ์ฒซ๋ฒ์งธ ์ํธ์ ๋๋ฒ์งธ ์ํธ ๊ทธ๋ฆฌ๊ณ "Sheet5"๋ผ๋ ์ด๋ฆ์ ์ํธ ์ธ๊ฐ๋ฅผ ๋์ ๋๋ฆฌ๋ก ํตํฉํด ๊ฐ์ ธ์จ๋ค. - None: ๋ชจ๋ ์ํธ๋ฅผ ๋์ ๋๋ฆฌ๋ก ํตํฉํด ๊ฐ์ ธ์จ๋ค.
โ
- header (์ธ์๋ ์ ์, ์ ์์ ๋ฆฌ์คํธ / ๊ธฐ๋ณธ๊ฐ์ 0)
: columns๋ฅผ ์ง์ ํ๋ ์ธ์. ์ง์ ํ์ง ์์ผ๋ฉด ๋งจ ์์ค์ด columns๊ฐ ๋๋ค. ๋ฆฌ์คํธ๋ก ์ง์ ํ๋ฉด ๋ฉํฐ ์ธ๋ฑ์ค์ธ columns๊ฐ ๋๋ค.
โ
- index_col (์ธ์๋ ์ ์, ์ ์์ ๋ฆฌ์คํธ / ๊ธฐ๋ณธ๊ฐ์ None)
: index๋ฅผ ์ง์ ํ๋ ์ธ์์ง์ ํ์ง ์์ผ๋ฉด RangeIndex๊ฐ index๋ก ๋ถ์ฌ๋๋ค. ๋ฆฌ์คํธ๋ก ์ง์ ํ๋ฉด ๋ฉํฐ ์ธ๋ฑ์ค์ธ index๊ฐ ๋๋ค.
pd.read_excel(url, sheet_name=3, header=2, index_col=0)
- [pandas] read_html
: ์นํ์ด์ง์ ํ ์ด๋ธ์ ๋ฐ์ดํฐํ๋ ์์ผ๋ก ๋ถ๋ฌ์ค๋ ํจ์
(๋ฆฌ์คํธ์ ๋ฐ์ดํฐํ๋ ์์ ๋ด์์ค๋ค)
โ
- io
: ์นํ์ด์ง์ ๊ฒฝ๋ก๋ช
โ
- match (์ธ์๋ ๋ฌธ์์ด ํน์ ์ ๊ทํํ์ / ๊ธฐ๋ณธ๊ฐ์ โ.+โ )
: ํ ์ด๋ธ ์ค์์ ํน์ ๋ฌธ์์ด์ ํฌํจํ ํ ์ด๋ธ์ ์ง์ ํ๋ ์ธ์.
(๊ธฐ๋ณธ๊ฐ์ ๋น ๋ฌธ์์ด์ ์ ์ธํ ๋ชจ๋ ๋ฌธ์์ด์ด๋ค.)
(์ง์ ํ์ง ์์ผ๋ฉด ๋ฌธ์์ด์ด ํฌํจ๋ ๋ชจ๋ ํ ์ด๋ธ์ ๊ฐ์ ธ์จ๋ค)
โ
- header (์ธ์๋ ์ ์, ์ ์์ ๋ฆฌ์คํธ / ๊ธฐ๋ณธ๊ฐ์ None)
: columns๋ฅผ ์ง์ ํ๋ ์ธ์
(๋ฆฌ์คํธ๋ก ์ง์ ํ๋ฉด ๋ฉํฐ ์ธ๋ฑ์ค์ธ columns๊ฐ ๋๋ค.)
โ
- index_col (์ธ์๋ ์ ์, ์ ์์ ๋ฆฌ์คํธ / ๊ธฐ๋ณธ๊ฐ์ None)
: index๋ฅผ ์ง์ ํ๋ ์ธ์
(์ง์ ํ์ง ์์ผ๋ฉด RangeIndex๊ฐ index๋ก ๋ถ์ฌ๋๋ค)
(๋ฆฌ์คํธ๋ก ์ง์ ํ๋ฉด ๋ฉํฐ ์ธ๋ฑ์ค์ธ index๊ฐ ๋๋ค)# ์์์ ์ธ์๋ฆฌ๊น์ง ์ถ๋ ฅ์ต์ pd.options.display.float_format = '{:.2f}'.format โ # ํด๋น ์น์ฌ์ดํธ์ ๋ชจ๋ ํ๋ฅผ ๋ฐ์ดํฐํ๋ ์์ผ๋ก ๋ง๋ค์ด ๋ฆฌ์คํธ์ ๋ด์์ค๋ค dfs = pd.read_html(url)
โ
df.head() # ๋ฐ์ดํฐ์ ์๋จ 5๊ฐ ํ ์ถ๋ ฅ
df.tail() # ๋ฐ์ดํฐ์ ํ๋จ 5๊ฐ ํ ์ถ๋ ฅ
df.shape # ํ, ์ด ํฌ๊ธฐ ํ์ธ
df.info() # ๋ฐ์ดํฐ์ ๋ํ ์ ๋ฐ์ ์ธ ์ ๋ณด
# ํ๊ณผ ์ด ํฌ๊ธฐ, ์ปฌ๋ผ๋ช
, ์ปฌ๋ผ๋ณ ๊ฒฐ์ธก์น, ์ปฌ๋ผ๋ณ ๋ฐ์ดํฐ ํ์
type(df) # ๋ฐ์ดํฐ ํ์
ํ์ธ - pandas.core.frame.DataFrame
df.columns # ์นผ๋ผ๋ช
ํ์ธ
df.index # DataFrame ์ธ๋ฑ์ค ํ์ธ
s.index # Series ์ธ๋ฑ์ค ํ์ธ
df.values # ๋ฐ์ดํฐ ํ์ธ(Numpy array return)
s.values # Series ๋ฐ์ดํฐ ํ์ธ
df.dtypes # ๊ฐ ์นผ๋ผ๋ง๋ค์ ๋ฐ์ดํฐ ํ์
ํ์ธ
df['Name'].unique() # ์ด(Series)์ ๊ณ ์ ๊ฐ๋ค ๋ฐํ
# ๊ฐ ํ์ ๋น ๊ฐ์ ๊ทธ๋ํ(๊ฐ๋จ ๊ทธ๋ํ)
df['ํ์ '].value_counts().sort_index(ascending=False).plot(kind='bar')
โ
df['Name'] # Series ๋ฆฌํด
df[['Name']] # DataFrame ๋ฆฌํด
df.loc[df["Age"] > 35, ["Name", "Age"]] # ๋์ด 35์ธ ์ด๊ณผํ ์ฌ๋์ ์ด๋ฆ, ๋์ด ์ถ๋ ฅ
df.iloc[[1,2,3], 0] = "No" # 1~3๋ฒ์งธํ, 0๋ฒ์งธ ์ด์ ๊ฐ์ "No"๋ก ๋ณ๊ฒฝ df.iloc[1:4, 0] = "No" # ์์ ๋์ผ
df.loc[(df['X1'] > 25) & (df['X1'] < df['X2']), df.loc['2023-08-12'] > 46]
โ
df[(df['X1'] > 25) & (df['X1'] < df['X2'])] # row์ ๋ํ ์กฐ๊ฑด๋ง ๊ฐ๋ฅ
โ
df.iloc[df.X2 > 20, 1] # iloc : boolean ์ธ๋ฑ์ฑ ๋ถ๊ฐ
df[df['X2'].isin(np.arange(20, 41))] # X2 ๊ฐ ์ค 20~40 ๋ฒ์์ ์๋ ๋ฐ์ดํฐ๋ง ์ถ์ถ
df[df['X1'].isin([1]) # X1 ๊ฐ์ด 1์ธ ๋ฐ์ดํฐ๋ง ์ถ์ถ
df[df["X1"].isna()] # X1 ๊ฐ์ด ๊ฒฐ์ธก์น์ธ ๋ฐ์ดํฐ ์ถ์ถ
df[df['X1'].notna()] # X1 ๊ฐ์ด ๊ฒฐ์ธก์น๊ฐ ์๋ ๋ฐ์ดํฐ ์ถ์ถ
- and์ ๋
ผ๋ฆฌ ์ฐ์ฐ์ : &
- or์ ๋
ผ๋ฆฌ ์ฐ์ฐ์ : |
- not์ ๋
ผ๋ฆฌ ์ฐ์ฐ์ : ~
๐ฉ ์ธ๋ฑ์ฑ ์ ๋ฆฌ
- ๋๊ดํธ ์ธ๋ฑ์ฑ
- ๋ ์ด๋ธ(์ด๋ฆ)๋ก ์ธ๋ฑ์ฑ
- ์ด๋ง ์ธ๋ฑ์ฑ ๊ฐ๋ฅ
- ํ๋ง ์ฌ๋ผ์ด์ฑ ๊ฐ๋ฅ
- ํ๊ณผ ์ด ๋์ ์ ์ฉ ๋ถ๊ฐ๋ฅ
โ- loc ์ธ๋ฑ์ฑ
- ๋ ์ด๋ธ(์ด๋ฆ)๋ก ์ธ๋ฑ์ฑ
- ํ๊ณผ ์ด ๋ชจ๋ ์ธ๋ฑ์ฑ๊ณผ ์ฌ๋ผ์ด์ฑ ๊ฐ๋ฅ
- ํ๊ณผ ์ด ๋์์ ์ ์ฉ ๊ฐ๋ฅ
โ- iloc ์ธ๋ฑ์ฑ
- ๋ก์ผ์ด์ ์ผ๋ก ์ธ๋ฑ์ฑ
- ํ๊ณผ ์ด ๋ชจ๋ ์ธ๋ฑ์ฑ๊ณผ ์ฌ๋ผ์ด์ฑ ๊ฐ๋ฅ
- ํ๊ณผ ์ด ๋์์ ์ ์ฉ ๊ฐ๋ฅ
- [pandas] filter
: ์ธ๋ฑ์ค(index, columns)์ ๋ ์ด๋ธ๋ก ๋ฐ์ดํฐํ๋ ์์ด๋ ์๋ฆฌ์ฆ๋ฅผ ํํฐ๋งํ๋ ํจ์
- items
: ํํฐ๋ง๋ ์ ํํ๊ฒ ์ผ์นํ๋ ๋ฌธ์์ด์ ์ง์ ํ๋ ์ธ์
- like
: ํํฐ๋ง๋ ํฌํจํ๋ ๋ฌธ์์ด์ ์ง์ ํ๋ ์ธ์
- regex (regular expression)
: ํํฐ๋ง๋ ์ ๊ท ํํ์์ ์ง์ ํ๋ ์ธ์
- axis (0 or 1 / ๊ธฐ๋ณธ๊ฐ์ 1)
: index๋ฅผ ํํฐ๋ง(axis=0)ํ๋์ง, columns๋ฅผ ํํฐ๋ง(axis=1)ํ๋์ง ๊ฒฐ์ ํ๋ ์ธ์
# ๋ ์ด๋ธ์ A๊ฐ ํฌํจ๋๋ ์ด ํํฐ๋ง
df.filter(like='A')
# ๋ ์ด๋ธ์ด A๋ก ์์๋๋ ์ด ํํฐ๋ง
df.filter(regex=r'^A')
# ๋ ์ด๋ธ์ด B ๋๋ C๋ฅผ ํฌํจํ๋ ์ด ํํฐ๋ง
df.filter(regex=r'B|C')
- ์ ๊ทํํ์
^ : ์์ $ : ๋ | : ๋๋
โ
- [pandas] dropna
: ๊ฒฐ์ธก๊ฐ(null)์ด ์๋ ์ด์ด๋ ํ์ ์ญ์ ํ๋ ํจ์
- axis (์ธ์๋ 0 or 1 / ๊ธฐ๋ณธ๊ฐ์ 0)
:์ด์ ์ญ์ ํ ๊ฒ์ธ์ง ํ์ ์ญ์ ํ ๊ฒ์ธ์ง ์ง์ ํ๋ ์ธ์๊ธฐ๋ณธ๊ฐ์ 0์ด๊ณ ํ์ ์ญ์ ํ๋ค
โ
- how (โanyโ or โallโ / ๊ธฐ๋ณธ๊ฐ์ โanyโ)
: NaN์ ๋ณด์ ํ ์ด์ด๋ ํ์ ์ด๋ป๊ฒ ์ญ์ ํ ๊ฒ์ธ์ง ๊ฒฐ์ ํ๋ ์ธ์- โanyโ : ํ๋๋ผ๋ NaN์ด๋ฉด ์ญ์ (๊ธฐ๋ณธ๊ฐ) - โallโ : ๋ชจ๋ NaN์ธ ์ด์ด๋ ํ์ ์ญ์
- subset (์ด์ ๋ ์ด๋ธ)
: ์ญ์ ํ NaN์ด ์๋ ์ด์ ๊ฒฐ์ ํ๋ ์ธ์
df.dropna(axis=0, inplace=True) # ๊ฒฐ์ธก ๊ฐ์ด ๋ค์ด์๋ ํ ์ ์ฒด ์ญ์
df.dropna(axis=1) # ๊ฒฐ์ธก ๊ฐ์ด ๋ค์ด์๋ ์ด ์ ์ฒด ์ญ์ ๋ DataFrame ๋ฆฌํด
# ๊ฒฐ์ธก์น๋ฅผ ํ๋๋ผ๋ ํฌํจํ๊ณ ์๋ ๋ฐ์ดํฐ๊ฐ ํ์ธ
df.loc[df.isnull().any(axis=1)] ๐๐๐
- [pandas] fillna
: ๊ฒฐ์ธก๊ฐ null(๋ํ์ ์ผ๋ก NaN)์ ์ง์ ํ ๊ฐ์ผ๋ก ์ฑ์ฐ๋ ํจ์
โ
- value (scalar, ๋์ ๋๋ฆฌ, ์๋ฆฌ์ฆ, ๋ฐ์ดํฐ ํ๋ ์)
: NaN์ ์ฑ์ธ ๊ฐ- scalar๋ฅผ ์ ๋ ฅํ๋ฉด ๋์ผํ ๊ฐ์ผ๋ก ์ฑ์ด๋ค - ๋์ ๋๋ฆฌ๋ ์๋ฆฌ์ฆ๋ฅผ ์ ๋ ฅํ๋ฉด key์ ๋ง๋ ์ด๋ง๋ค ๋ค๋ฅธ ๊ฐ์ ์ฑ์ด๋ค - ๋ฐ์ดํฐ ํ๋ ์์ ์ธ๋ฑ์ค๊ฐ ๋์ผํ ๊ฐ์ ์ฑ์ด๋ค
โ
- method (์ธ์๋ โbackfillโ, โbfillโ, โpadโ, โffillโ, None / ๊ธฐ๋ณธ๊ฐ์ None)
: ๊ทผ์ ํ ๊ฐ์ผ๋ก NaN์ ์ฑ์ธ ๋ ์ฌ์ฉํ๋ ์ธ์- ffill / pad : ์ด์ ๊ฐ์ผ๋ก ์ฑ์ด๋ค - bfill / backfill: ์ดํ์ ๊ฐ์ผ๋ก ์ฑ์ด๋ค
โ
- axis (์ธ์๋ 0 ๋๋ 1 / ๊ธฐ๋ณธ๊ฐ์ 0)
: method๋ก ๊ทผ์ ํ ๊ฐ์ ์ฑ์ธ ๋ ์ถ์ ์ง์ ํ๋ ์ธ์0์ด๋ฉด ์ด์์ ๊ทผ์ ํ ๊ฐ์ ์ฑ์ด๋ค
โ
๐ฅ TIP) ์์ ๋ฐ์ดํฐ๋ก ์ค์ต ํ ํฐ ๋ฐ์ดํฐ์ ์ ์ฉํด ๋ณผ ๊ฒ!!!
- ์ฒ์๋ถํฐ ๋น ๋ฐ์ดํฐ์ ์ ์ฉํ๋ ๊ฒ ๋น์ถ!!
- ์ง๊ณํจ์(aggregate function)
- ๊ทธ๋ฃน์ ๊ฐ์ ํ๋๋ก ๋ฆฌํดํด์ฃผ๋ ์ฐจ์ ์ถ์ ํจ์๊ฐ ๋์ ์๋ฏธ์์ ๋ชจ๋ ์ง๊ณ ํจ์(๊ฐ์ข ํต๊ณ ํจ์)
- [pandas] value_counts
: ๋ฐ์ดํฐ ํ๋ ์์ด๋ ์๋ฆฌ์ฆ์ ๊ณ ์ ๊ฐ์ ๊ฐ์๋ฅผ ํ์ ํ๋ ํจ์# Series ์ ์ฉ ์์ s.value_counts(normalize=False, sort=True, ascending=False)
โ
- normalize (์ธ์๋ bool / ๊ธฐ๋ณธ๊ฐ์ False)True์ผ๋๋ ํ์คํํด์ ๋น์จ๋ก ๋ณด์ฌ์ค๋ค
โ
- sort (์ธ์๋ bool / ๊ธฐ๋ณธ๊ฐ์ True)
: ๋น๋์ ๋ฐ๋ผ ์ ๋ ฌํ ์ง ์ฌ๋ถ ์ง์ ํ๋ ์ธ์
โ
- ascending (์ธ์๋ bool / ๊ธฐ๋ณธ๊ฐ์ False)
: ์ ๋ ฌ ๋ฐฉ์์ ๊ฒฐ์ ํ๋ ์ธ์(๊ธฐ๋ณธ๊ฐ์ ๋ด๋ฆผ์ฐจ์)
โ# DataFrame ์ ์ฉ ์์ df.value_counts(subset=None, normalize=False, sort=True, ascending=False)
โ
- subset (์ธ์๋ ๋ ์ด๋ธ ๋๋ ๋ ์ด๋ธ ๋ด์ ๋ฆฌ์คํธ/ ๊ธฐ๋ณธ๊ฐ์ None)
: ๊ณ ์ ๊ฐ์ ๊ฐ์๋ฅผ ํ์ ํ ์ด์ ์ง์ ํ๋ ์ธ์๊ทธ ์ธ ์ธ์๋ ์๋ฆฌ์ฆ์ ์ ์ฉํ ๋์ ๋์ผํ๋ค
# ๋ฐ์ดํฐํ๋ ์์ value_counts ํจ์๋ฅผ ์ ์ฉํด col1๊ณผ col2์ ์กฐํฉ ํ์ df.value_counts(['col1', 'col2']) โ # subset์ ๋ชจ๋ ์ด์ ๋ด๋๋ค๋ฉด ๊ธฐ๋ณธ๊ฐ์ผ๋ก๋ ๊ฐ๋ฅ df.value_counts()
df.sum() # ๊ฐ ์ด์ ํฉ(ํ ๊ธฐ์ค ํฉ)
df.sum(axis=1) # ๊ฐ ํ์ ํฉ(์ด ๊ธฐ์ค ํฉ)
df.cumsum() # ํ ๊ธฐ์ค ๋์ ํฉ
df.mean() # ๊ฐ ์ด์ ํ๊ท (ํ ๊ธฐ์ค ํ๊ท )
df["Age"].mean() # Age ์นผ๋ผ์ ํ๊ท
df["Age"].median() # Age ์นผ๋ผ์ ์ค์๊ฐ
df.describe() # ์ซ์ ์ปฌ๋ผ๋ค์ ํต๊ณ ์ ๋ณด(count, mean, std, min, max, 4๋ถ์์)
df['Pclass'].value_counts() # ๊ฐ์ ๊ฐ์
# agg()๋ฅผ ํตํด ์ฌ๋ฌ ๊ฐ์ ์ด์ ๋ค์ํ ํจ์๋ฅผ ์ ์ฉ
# ๊ฐ ์ด๋ง๋ค ๋ค๋ฅธ ํจ์๋ฅผ ๋งคํ : group๊ฐ์ฒด.agg({โ์ด1โ: ํจ์1, โ์ด2โ: ํจ์2, โฆ})
df.agg({'Age':['min', 'max'],'Fare':['mean', 'median']})
# ๋ชจ๋ ์ด์ ์ฌ๋ฌ ํจ์๋ฅผ ๋งคํ : group๊ฐ์ฒด.agg([ํจ์1, ํจ์2, ํจ์3,โฆ])
df.agg(['mean', 'max'])
- [pandas] pivot_table
: ์์(raw) ๋ฐ์ดํฐ๋ฅผ ํผ๋ฒ ํ ์ด๋ธ๋ก ๋ฐ๊พธ๋ ํจ์
- Pivot Table
: ๊ธฐ์กด ํ ์ด๋ธ ๊ตฌ์กฐ๋ฅผ ํน์ column์ ๊ธฐ์ค์ผ๋ก ์ฌ๊ตฌ์กฐํํ ํ ์ด๋ธ
(์ฃผ๋ก ์ด๋ค column์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ํด์ํ๊ณ ์ถ์ ๋ ์ฌ์ฉ)
- values
: ์ง๊ณํ ๋์ ์ด
- index (์ด, ๋๋ grouper)
: ํผ๋ฒ ํ ์ด๋ธ์ index๋ก ๊ตฌ๋ถ๋ ํน์ฑ(์ด)
- columns (์ด, ๋๋ grouper)
: ํผ๋ฒ ํ ์ด๋ธ์ columns๋ก ๊ตฌ๋ถ๋ ํน์ฑ(์ด)
- aggfunc (์ง๊ณ ํจ์)
: ๊ทธ๋ฃน์ ์ฐจ์์ ์ถ์์ํฌ ํจ์(๊ธฐ๋ณธ๊ฐ์ 'mean')
# ์ฌํ ๊ณ๊ธ ๋ฐ ์ฑ๋ณ์ ๊ธฐ์ค์ผ๋ก ์์กด๋ฅ ํ์
pd.pivot_table(data=titanic, index=['Pclass', 'Sex'], values='Survived', aggfunc=['count', 'sum', 'mean'])
# ๋ฐ / ์ฑ๋ณ๊ณผ ๋น๊ณ ๋ก ๋๋ ์ ์ธ์์ ๊ตฌํ๊ธฐ
df.pivot_table('์ ์', index='๋ฐ', columns=['์ฑ๋ณ', '๋น๊ณ '], aggfunc='count')
# ๋ฐ๊ณผ ์ฑ๋ณ๋ก ๋๋์ด ํ๊ท ์ ์์ ์ธ์์ ๋์์ ๊ตฌํ๊ธฐ
df.pivot_table('์ ์', index='๋ฐ', columns='์ฑ๋ณ', aggfunc=['mean', 'count'])
- [pandas] pivot
: ์์(raw) ๋ฐ์ดํฐ๋ฅผ ํผ๋ฒ ํ ์ด๋ธ๋ก ๋ฐ๊พธ๋ ํจ์
- index (์ด, ๋๋ grouper)
: ํผ๋ฒ ํ ์ด๋ธ์ index๋ก ๊ตฌ๋ถ๋ ํน์ฑ(์ด)
- columns (์ด, ๋๋ grouper)
: ํผ๋ฒ ํ ์ด๋ธ์ columns๋ก ๊ตฌ๋ถ๋ ํน์ฑ(์ด)
- values
: ์ง๊ณํ ๋์ ์ด
# pivot ํจ์๋ ์ง๊ณํจ์๊ฐ ํ์ ์์ผ๋ฏ๋ก ๋ฌธ์์ด์ ํผ๋ฒํ
ํ๊ธฐ์ ํธ๋ฆฌํ๋ค
df.pivot(values='์ด๋ฆ', index='๋ฐ', columns='๋ฐ๋ฑ์')
- ํผ๋ฒํ ์ด๋ธ์ lambdaํจ์ ์ ์ฉ ๐๐๐
# ์ ์ค ๋ฑ๊ธ๋ณ ์ต๊ณ ๋ น์ ์ด๋ฆ์ ํผ๋ฒํ ์ด๋ธ๋ก ๋ง๋ค๊ธฐ df.pivot_table('Age', index='Pclass', columns='Sex', aggfunc=lambda x: df .loc[x.idxmax(), 'Name'])
- [pandas] groupby ๐๐๐๐๐
: ๊ทธ๋ฃน ๋ด์์ ํจ์๋ฅผ ์ ์ฉํ๊ฒ ํด์ฃผ๋ ํจ์
- by
: ๊ทธ๋ฃน์ ๋๋๋ ๊ธฐ์ค(๋ณต์๋ผ๋ฉด ๋ฆฌ์คํธ๋ก ์ ๋ ฅ)
- axis (0 or 1)
: ๊ทธ๋ฃนํด์ ํจ์๋ฅผ ํ์ ์ ์ฉํ ๊ฒ์ธ์ง ์ด์ ์ ์ฉํ ๊ฒ์ธ์ง ์ง์ ํ๋ ์ธ์(๊ธฐ๋ณธ๊ฐ์ ์ด)
- level
: ์ธ๋ฑ์ค๋ก ๊ทธ๋ฃน์ ๋๋ ๋ ์ฌ์ฉํ๋ ์ธ์
- as_index (bool / ๊ธฐ๋ณธ๊ฐ์ True)
: groupby๋ก ์ง๊ณ ํจ์๋ฅผ ์ฌ์ฉํ ๋ ๊ทธ๋ฃน์ด ์ธ๋ฑ์ค๊ฐ ๋ ์ง ์ง์ ํ๋ ์ธ์
- sort (bool / ๊ธฐ๋ณธ๊ฐ์ True)
: ๊ทธ๋ฃน์ key๋ก ์ ๋ ฌ์ ํ ๊ฒ์ธ์ง ์ง์ ํ๋ ์ธ์# data๋ ๋ณต์๋ก ์ง์ ์ด ๊ฐ๋ฅ (์ฌ์ค data๋ ๋๊ดํธ ์ธ๋ฑ์ฑ) df.groupby(['๋ฐ', '์ฑ๋ณ'])[['๊ตญ์ด', '์ํ']].mean() โ # ์ฑ๋ณ๊ณผ ํด๋์ค๋ก ๊ทธ๋ฃน ๋๋ ๋์ด์ ์๊ธ์ ํ๊ท ๊ตฌํ๊ธฐ df.groupby(["Sex", "Pclass"])[['Age', 'Fare']].mean() โ # groupby๋ฅผ ํตํด ์ฑ๋ณ์ ๋ฌถ์ ๋ค์, ์์กด์จ์ ํ๊ท ๊ตฌํ๊ธฐ df.groupby("Sex")['Survived'].mean() โ # ์ธ๋ฑ์ฑ์ ํ์ง ์์ผ๋ฉด ์ ์ฒด์ ์ ์ฉํ๋ค (๋จ by์ ์ง์ ๋ ์ด์ ์ ์ธ) df.groupby(['๋ฐ', '์ฑ๋ณ']).mean() โ # ๋ฐ์ผ๋ก ๊ทธ๋ฃนํ ํด์ rank ํจ์ ์ ์ฉํ๊ธฐ df['ํ๊ธ๋ด๋ฑ์'] = df.groupby('๋ฐ')['์ ์'].rank(ascending=False) โ # ๋ฐ๊ณผ ์ฑ๋ณ๋ก ๊ทธ๋ฃนํ ํด์ rank ํจ์ ์ ์ฉํ๊ธฐ df['๋ฑ์2'] = df.groupby(['๋ฐ', '์ฑ๋ณ'])['์ ์'].rank(ascending=False)
# ์ ์ฉํ ํจ์๋ก ์ง๊ณํจ์ ์ ์ฉํ๊ธฐ df.groupby(['๋ฐ', '์ฑ๋ณ'])['์ ์'].mean()
# groupby๋ก shift ํจ์ ์ ์ฉํ๊ธฐ df2['์ ์ผ์ ๊ธ'] = df2.groupby('์ด๋ฆ')['์ ๊ธ'].shift()
- ์ง๊ณํจ์๊ฐ ์๋๋ : ๊ธฐ์กด ์ด์ index๋ฅผ ๊ทธ๋๋ก ์ ์งํ ์๋ฆฌ์ฆ ๋ฐํ
- ์ง๊ณํจ์์ผ ๋ : index๊ฐ ์์ด์ง๊ณ ๊ทธ๋ฃน์ ๋๋๋ key๊ฐ ์๋ก์ด index๊ฐ ๋๋ค
โ- agg์ ์ฅ์
- agg ์ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ๋ฉด ํํ๋ก ์ง๊ณ ๊ฒฐ๊ณผ์ ์ด์ด๋ฆ์ ๋ฐ๊ฟ ์ ์๋ค(set_axis๋ฑ์ผ๋ก ์์ฝ๊ฒ ๊ฐ๋ฅ) - ๋ณต์์ ์ง๊ณํจ์ ์ฌ์ฉ๊ฐ๋ฅ(pivot_table๋ก๋ ๊ฐ๋ฅ) - ์ด๋ง๋ค ๋ค๋ฅธ ์ง๊ณํจ์ ์ฌ์ฉ๊ฐ๋ฅ(pivot_table๋ก๋ ๊ฐ๋ฅ) - lambda ํจ์ ์ฌ์ฉ๊ฐ๋ฅ(pivot_table๋ก๋ ๊ฐ๋ฅ)
# ํจ์๋ฅผ ํํ๋ก ์ ๋ ฅํด ์ด ์ด๋ฆ์ ๋ฐ๊ฟ ์ ์๋ค df.groupby(['๋ฐ'])['๊ตญ์ด'].agg([('๊ตญ์ดํ๊ท ', 'mean')]) โ # ๋ณต์์ ์ง๊ณํจ์ ์ ์ฉ df.groupby(['๋ฐ'])['๊ตญ์ด'].agg(['mean', 'std']) โ # ์ ๊ฒฐ๊ณผ๋ ํผ๋ฒ ํ ์ด๋ธ๋ก๋ ๊ฐ๋ฅํ๋ค df.pivot_table('๊ตญ์ด', index='๋ฐ', aggfunc=['mean', 'max']).droplevel(1, axis=1) โ # ๋ณต์์ ์ง๊ณํจ์ ์ผ ๋๋ ์ด ์ด๋ฆ์ ๋ฐ๊ฟ ์ ์๋ค df.groupby(['๋ฐ'])['๊ตญ์ด'].agg([('๊ตญ์ดํ๊ท ', 'mean'), ('ํ์คํธ์ฐจ','max')]) โ # ์ด๋ง๋ค ๋ค๋ฅธ ์ง๊ณํจ์ ์ ์ฉ df.groupby(['๋ฐ']).agg({'๊ตญ์ด': 'mean', '์ํ': 'count'}) โ # ์ด๋ง๋ค ๋ค๋ฅธ ์ง๊ณํจ์ ์ ์ฉ(pivot_table๋ก๋ ๊ฐ๋ฅ) df.pivot_table(['๊ตญ์ด', '์ํ'], index='๋ฐ', aggfunc={'๊ตญ์ด':'mean', '์ํ':'count'}) โ # lambda ํจ์๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. ๋ฐ๋ณ ์ํ ์ ์๊ฐ 90 ์ด์์ธ ์ธ์์ df.groupby(['๋ฐ'])['์ํ'].agg(lambda x: (x > 80).sum()) โ # lambda ํจ์๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. ๋ฐ๋ณ ์ํ ์ ์๊ฐ 90 ์ด์์ธ ์ธ์์(pivot_table๋ก๋ ๊ฐ๋ฅ) df.pivot_table('์ํ', index='๋ฐ', aggfunc=lambda x: (x > 80).sum())
- transform์ ์ฅ์
- transform๊ณผ ์ง๊ณํจ์๋ฅผ ์ด์ฉํด ์ง๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ก ๋ง๋ค์ ์๋ค - ์ด๋ก ๋ง๋ค์ ์์ผ๋ฏ๋ก ์ง๊ณ ๊ฒฐ๊ณผ๋ก ๋ถ๋ฆฌ์ธ ์ธ๋ฑ์ฑ๋ ํ ์ ์๋ค
# transform์ ์ง๊ณํจ์์ ์ ์ฉ ๊ฒฐ๊ณผ๋ฅผ ์๋ณธ df์ ๊ฐ์ ๊ธธ์ด์ ์๋ฆฌ์ฆ๋ก ๋ฐํํ๋ค df.groupby('๋ฐ')['์ํ'].transform('mean') โ # ๋ฐํ๊ท ๋ณด๋ค ์ ์๊ฐ ๋์ ํ์๋ค์ ๋ฐ์ดํฐ๋ง ํํฐ๋ง cond1 = df['์ํ'] > df.groupby('๋ฐ')['์ํ'].transform('mean') df[cond1]
โ
df.loc['Tommy'] = new_row # ํ ์ถ๊ฐ
df['Region'] = df['Address'].split()[0] # ์ด ์ถ๊ฐ
df['Region'] = ['์์ธ, '๋ถ์ฐ', '๋๊ตฌ'] # ์ด ์์
df['Region'] = s1 # Series ๋ฐฐ์
df[['๊ณผํ', '์ฌํ']] = 'pass' # ๋ณต์์ ์ด ํ๋ฒ์ ์ถ๊ฐ
- [pandas] drop
: ๋ฐ์ดํฐ ํ๋ ์์ ํ์ด๋ ์ด์ ์ญ์ ํ๋ ํจ์
โ
- labels (์ธ์๋ ๋ ์ด๋ธ ํน์ ๋ฆฌ์คํธ)
: ๋๋กญํ ํ์ ๋ ์ด๋ธ(์ด๋ฆ)์ด๋ ์ด์ ๋ ์ด๋ธ๋ณต์๋ผ๋ฉด ๋ฆฌ์คํธ๋ก ๋ฌถ์ด์ ์ ๋ ฅํ๋ค.
โ
- axis (์ธ์๋ 0 ๋๋ 1/๊ธฐ๋ณธ๊ฐ์ 0)
: ์ญ์ ํ ๋ถ๋ถ์ด ํ์ธ์ง ์ด์ธ์ง๋ฅผ ์ง์ ํ๋ ์ธ์๊ธฐ๋ณธ๊ฐ์ 0์ด๊ณ ํ์ ์ญ์ ํ๋ค
โ
- level (๋ฉํฐ ์ธ๋ฑ์ค์ ๋ ๋ฒจ / ๊ธฐ๋ณธ๊ฐ์ None)
: ๋ฉํฐ์ธ๋ฑ์ค์ผ ๋ ์ญ์ ํ ๋ ๋ฒจ์ ์ง์ ํ๋ ์ธ์# D์ด๋ง ๋นผ๊ณ ๋ชจ๋ ๊ฐ์ ธ์ค๊ธฐ df.drop('D', axis=1) # ์ญ์ ๊ฐ ๋ ํธ๋ฆฌ โ # ํ์ ๋์ ๋ค ๊ทธ๋ฆฌ๊ณ ์ด์ C์ด๋ง ๋นผ๊ณ ๋ค ๊ฐ์ ธ์ค๊ธฐ df.loc[['๋', '๋ค']].drop('C', axis=1) โ df.drop(np.arange(10, 20), axis=0) # 10~19ํ ์ญ์
โ
๐ฅ TIP) Pandas์์๋ ๋๋ถ๋ถ์ ํจ์ ์ ์ฉ ๊ฒฐ๊ณผ๊ฐ ์๋ณธ์ ๋ฎ์ด์ฐ์ง ์๋๋ค
- ๋ฎ์ด ์ฐ๊ธฐ ์ํ ๋ฐฉ๋ฒ : inplace=True ์ฌ์ฉ (๋๋) ๊ธฐ์กด ๋ณ์์ ๋ค์ ์ง์
โ
- ํน์ง
- str ์ ๊ทผ์ ์ฌ์ฉ
- ์๋ฆฌ์ฆ์๋ง ์ ์ฉ ๊ฐ๋ฅ
- ๋์ฒด๋ก ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ ๊ทํํ์ ์ฌ์ฉ ๊ฐ๋ฅ# A์ด์ ๋ฌธ์์ด์ ๊ธธ์ด df['A'].str.len() # df['A'].apply(len)์ ๊ฒฐ๊ณผ ๋์ผ โ # B์ด์์ ๊ฐ ์ ๋ง๋ค ์์ ์ธ๊ธ์๋ง ์ฌ๋ผ์ด์ฑ df['B'].str[:3] # df['B'].apply(lambda x: x[:3])์ ๊ฒฐ๊ณผ ๋์ผ โ # C์ด์์ ๊ฐ ์ ๋ง๋ค - ์ ๋ถ๋ถ์ ๊ฐ์ ธ์ค๊ธฐ df['C'].str.split('-').str[0] # str ์ ๊ทผ์ 2๋ฒ ์ฌ์ฉ # df['C'].apply(lambda x: x.split('-')[0])์ ๊ฒฐ๊ณผ ๋์ผ โ # D์ด์์ cat ๋๋ dog ํฌํจ์ฌ๋ถ๋ฅผ bool๋ก ๋ง๋ค๊ธฐ # ๊ธฐ๋ณธ ์ค์ ์ด ์ ๊ท ํํ์์ด๊ธฐ ๋๋ฌธ์ 'r'์ ๋นผ๋ ๊ฐ์ ๊ฒฐ๊ณผ ๋์จ๋ค df['D'].str.contains(r'cat|dog') โโ df['Name'].str.contains('Mr.', regex=False) # regex = False : exact matching # regex = True(๊ธฐ๋ณธ๊ฐ) : ๊ธ์, ์ซ์, ํน์ ๋ฌธ์ ๋ฐ๋ก ๋งค์นญ(substring matching) โ # str.extract ํจ์๋ ๋ฐ๋์ ๋ฌธ์์ด ์์ ์๊ดํธ๋ก ๊ทธ๋ฃนํ(grouping) ํ์ # E์ด์์ cat์ ๊ฐ์ง๊ณ ์๋ค๋ฉด cat์ ์ถ์ถํ๊ธฐ df['E'].str.extract('(cat)') โ # E์ด์์ cat ๋๋ dog๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด ํด๋น ๋ฌธ์์ด์ ์ถ์ถํ๊ธฐ - ์ ๊ทํํ์ # ๊ธฐ๋ณธ ์ค์ ์ด ์ ๊ท ํํ์์ด๊ธฐ ๋๋ฌธ์ 'r'์ ๋นผ๋ ๊ฐ์ ๊ฒฐ๊ณผ ๋์จ๋ค df['E'].str.extract(r'(cat|dog)')
โ
- [pandas] merge
: Pandas์์ ์์ ์ VLOOKUP๊ณผ ๊ฐ์ด ๋ณํฉํ๋ ํจ์
(VLOOKUP : ๋ ๋ฐ์ดํฐํ๋ ์์ ๊ธฐ์ค ์ด์ ๋ด์ฉ์ ๋ฐ๋ผ ๋ณํฉํ๋ ํจ์)
- right (์ธ์๋ ๋ฐ์ดํฐํ๋ ์ ํน์ ์๋ฆฌ์ฆ)
: ๋ณํฉํ ๊ฐ์ฒด
- how (์ธ์๋ โleftโ, โrightโ, โouterโ, โinnerโ, โcrossโ / ๊ธฐ๋ณธ๊ฐ์ โinnerโ)
: ๋ณํฉํ ๋ฐฉ์์ ๊ฒฐ์ ํ๋ ์ธ์- left: ์ผ์ชฝ ๋ฐ์ดํฐํ๋ ์์ ํค(key)๋ง์ ๋ณํฉ์ ์ฌ์ฉํ๋ค.(์์ ์ vlookup๊ณผ ์ ์ฌ) - right: ์ค๋ฅธ์ชฝ ๋ฐ์ดํฐํ๋ ์์ ํค(key)๋ง์ ๋ณํฉ์ ์ฌ์ฉํ๋ค. - outer: ์์ชฝ ๋ฐ์ดํฐํ๋ ์์ ํค(key)๋ค์ ํฉ์งํฉ์ ๋ณํฉ์ ์ฌ์ฉํ๋ค. - inner: ์์ชฝ ๋ฐ์ดํฐํ๋ ์์ ํค(key)๋ค์ ๊ต์งํฉ์ ๋ณํฉ์ ์ฌ์ฉํ๋ค. - cross: ์์ชฝ ๋ฐ์ดํฐํ๋ ์์ ๊ณฑ์งํฉ(cartesian product)์ ์์ฑํ๋ค.
โ
- on (์ธ์๋ ์ด์ ๋ ์ด๋ธ ๋๋ ๋ฆฌ์คํธ / ๊ธฐ๋ณธ๊ฐ์ None)
: ๋ณํฉ์ ๊ธฐ์ค์ด ๋๋ ์ด์ ์ง์ ํ๋ ์ธ์- ๊ธฐ๋ณธ ๊ฐ์ ์์ชฝ ๋ฐ์ดํฐํ๋ ์์์ ์ด๋ฆ์ด ๊ณตํต์ธ ์ด๋ค์ด ์ง์ ๋๋ค. - ๋ฆฌ์คํธ๋ก ์ ๋ ฅํ๋ฉด ๋ณต์์ ์ด์ ๊ธฐ์ค์ผ๋ก ๋ณํฉํ๋ค. * None์ ์๋ฏธ : ๊ท์น์ ์๋๋ฐ ์ค์ ๊ฐ์ ์ํฉ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
pd.options.display.max_rows = 6 # ํ๋ค์ค ์ถ๋ ฅ์ต์ ์กฐ์ df3 = df1.merge(df2, how='left', on='์ ํ') df3.to_excel('result.xlsx', index=False) # ๊ฒฐ๊ณผ๋ฅผ ์์ ํ์ผ๋ก ์ ์ฅ โ # ๋ค์ค์๊ฑด VLOOKUP : ๋ณต์์ ์ด์ ๊ธฐ์ค์ผ๋ก vlookup df4 = df1.merge(df2, how='left', on=['์ ์ฒด', '์๋ฃ']) df4 = df1.merge(df2, how='left') # ์์ ๊ฒฐ๊ณผ ๋์ผ
- [pandas] merge_asof
- left (์ธ์๋ ๋ฐ์ดํฐํ๋ ์ ํน์ ์๋ฆฌ์ฆ)
: ๋ณํฉํ ๊ฐ์ฒด1
- right (์ธ์๋ ๋ฐ์ดํฐํ๋ ์ ํน์ ์๋ฆฌ์ฆ)
: ๋ณํฉํ ๊ฐ์ฒด2
- on (์ธ์๋ ์ด์ ๋ ์ด๋ธ)
: ์ ์ฌ์ผ์น๋ก ๋ณํฉํ ๊ธฐ์ค์ด ๋๋ ์ด์ ๋ ์ด๋ธ- ๋ฐ๋์ ํ๋์ ์ด๋ง ์ง์ ํด์ผ ํ๋ค. - ์ซ์๋ datetime ๊ฐ์ด ์ ์ฌ์ผ์น๊ฐ ๊ฐ๋ฅํ ์๋ฃํ์ ์ด์ด์ด์ผ ํ๋ค. - ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์ด ์์ด์ผ ํ๋ค.๐๐๐
- by (์ธ์๋ ์ด์ ๋ ์ด๋ธ ๋๋ ์ด์ ๋ ์ด๋ธ์ ๋ฆฌ์คํธ)
: ์ ํํ ์ผ์น์ํฌ ์ด์ ์ง์ ํ๋ ์ธ์
- direction (์ธ์๋ โbackwardโ, โforwardโ, โnearestโ / ๊ธฐ๋ณธ๊ฐ์ โbackwardโ)
: ๊ฒฝ๊ณ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ์ฌ์ผ์น ์ํฌ ๋ฐฉํฅ์ ๊ฒฐ์ ํ๋ ์ธ์- โbackwardโ, โforwardโ๋ ์๋ ๊ทธ๋ฆผ ์ฐธ๊ณ - โnearestโ๋ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฐ์ ์ฐพ์ ๋ณํฉํ๋ค.
- ์ถ์ฒ : ํ์ด์ฌ์ผ๋ก ํ ์ ์๋ ๋ชจ๋ ๊ฒ with 47๊ฐ ํ๋ก์ ํธ ์ด๊ฒฉ์ฐจ ํจํค์ง
df1 = df1.sort_values('์๋') df2 = df2.sort_values('์๋') โ # ์ฌ์ด์ฆ์ ์ข ๋ฅ๋ ์ ํํ ์ผ์น์ํค๊ณ ์๋์ ๋ฒ์๋ก ๋ณํฉ pd.merge_asof(df1, df2, on='์๋', by=['์ฌ์ด์ฆ', '์ข ๋ฅ'])
- [pandas] concat
- objs (์ธ์๋ ์๋ฆฌ์ฆ ํน์ ๋ฐ์ดํฐํ๋ ์์ ๋ฐฐ์ด)
: ๊ฒฐํฉํ ์๋ฆฌ์ฆ๋ ๋ฐ์ดํฐํ๋ ์๋ค์ ๋ฆฌ์คํธ๋ก ์ง์ ํ๋ ์ธ์
- axis (์ธ์๋ 0 ๋๋ 1 / ๊ธฐ๋ณธ๊ฐ์ 0)
: ๊ฒฐํฉํ ์ถ ๋ฐฉํฅ์ ์ง์ ํ๋ ์ธ์- axis=0์ผ๋๋ ํ์ด ์ฆ๊ฐํ๋ ๋ฐฉํฅ์ผ๋ก ๊ฒฐํฉ - axis=1์ผ๋๋ ์ด์ด ์ฆ๊ฐํ๋ ๋ฐฉํฅ์ผ๋ก ๊ฒฐํฉ
โ
- join (์ธ์๋ โinnerโ, โouterโ / ๊ธฐ๋ณธ๊ฐ์ โouterโ)
: ๊ฒฐํฉ๋ฐฉ์์ ์ง์ ํ๋ ์ธ์- inner๋ columns๊ฐ ๊ต์งํฉ์ผ๋ก ๊ฒฐํฉํ๋ค (axis=1์ผ๋๋ index๊ฐ ๊ต์งํฉ) - outer๋ columns๊ฐ ํฉ์งํฉ์ผ๋ก ๊ฒฐํฉํ๋ค. (axis=1์ผ๋๋ index๊ฐ ํฉ์งํฉ)
โ
- keys (์ธ์๋ ๋ฐฐ์ด / ๊ธฐ๋ณธ๊ฐ์ None)
: ๊ฒฐํฉํ๋ ๊ฐ ๋ฐ์ดํฐํ๋ ์์ ๋ ๋ฒจ์ ๋ถ์ฌํ๋ ์ธ์pd.concat([df1, df2]) # ์ธ๋ก, outer join์ผ๋ก ๊ฒฐํฉ pd.concat([df1, df2], axis=1, join='inner') # ๊ฐ๋ก, inner join์ผ๋ก ๊ฒฐํฉ โ pd.concat([df1, df2, df3]) # 3๊ฐ์ ๋ฐ์ดํฐ ์ธ๋ก๋ก ๋ณํฉ โ # ์์ ํ์ผ์ ๋ชจ๋ ์ํธ๋ฅผ ๋ณํฉ pd.concat(pd.read_excel(url, sheet_name=None).values())
โ
- [pandas] astype
: ๋ฐ์ดํฐ ํ๋ ์์ด๋ ์๋ฆฌ์ฆ์ ์๋ฃํ์ ๋ฐ๊พธ๋ ํจ์
- dtype
: ์๋ฃํ์ ์ง์ ํ๋ ์ธ์- str : ๋ฌธ์์ด - int : ์ ์ - float : ์ค์ - category : ์นดํ ๊ณ ๋ฆฌ(ํนํ๋ ๋ค๋ฅธ ํจ์ ์ฌ์ฉํ์ฌ ํ ๋ณํ) - bool : True ๋๋ False - datetime : ๋ ์ง๋ ์๊ฐ(ํนํ๋ ๋ค๋ฅธ ํจ์ ์ฌ์ฉํ์ฌ ํ ๋ณํ) * ํน์ ์ด์๋ง ์ ์ฉํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ด์ ๋ ์ด๋ธ๊ณผ ์๋ฃํ์ ๋์ ๋๋ฆฌ๋ก ๋ฃ์ผ๋ฉด ๋๋ค ex) A์ด์ ๋ฌธ์์ด๋ก B์ด์ ์ ์๋ก ๋ฐ๊พธ๊ณ ์ถ์ ๊ฒฝ์ฐ dtype์ธ์์ {'A':'str', 'B':'int'}์ ์ธ์๋ก ์ ๋ ฅํ๋ฉด ๋๋ค
df1.astype('str') # ๋ฐ์ดํฐ ํ๋ ์์ ์๋ฃํ์ ๋ฌธ์์ด๋ก ๋ณ๊ฒฝ df1['C'] = df1['C'].astype('int') # ํน์ ์ด์ ์๋ฃํ ๋ฐ๊พธ๊ธฐ1 df.astype({'C':'int'}) # ํน์ ์ด์ ์๋ฃํ ๋ฐ๊พธ๊ธฐ2
- [pandas] to_numeric
: ์ซ์ ์๋ฃํ์ผ๋ก ๋ฐ๊พธ๋ ํจ์(์๋ฆฌ์ฆ์๋ง ์ฌ์ฉ๊ฐ๋ฅํ ํจ์)# to_numeric์ errors='coerce'๋ ์ซ์๋ก ๋ฐ๊ฟ ์ ์์ผ๋ฉด NaN์ผ๋ก ๋ณํ pd.to_numeric(s1, errors='coerce') โ # errors='ignore'๋ ์ซ์๋ก ๋ฐ๊ฟ ์ ์์ผ๋ฉด ๋ชจ๋ ๋ฐ๊พธ์ง ์๊ณ ๊ทธ๋๋ก ๋๋ ค์ค๋ค pd.to_numeric(s1, errors='ignore')
- [pandas] Categorical
<category ์๋ฃํ ์ฌ์ฉํ๋ ์ด์ > - ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ - ์์ ๋ถ์ฌํด ์ํ๋ ์์๋ก ์ ๋ ฌ
s = pd.Series(['S', 'M', 'XL']*10000000) s1 = pd.Series(pd.Categorical(s, categories=['S', 'M', 'XL'], ordered=True)) s1.sort_values() # s1์ S์ M, XL ์์๋ก ์ ๋ ฌ๊ฐ๋ฅ
โ
- [pandas] sort_values
- by (์ธ์๋ label ๋๋ label์ ๋ฆฌ์คํธ)
: ์ ๋ ฌ์ ๊ธฐ์ค์ด ๋ ๋ฐฐ์ด(์ฃผ๋ก ์ ๋ ฌ์ ๊ธฐ์ค์ธ ์ด)์ ์ง์ ํ๋ ์ธ์
- ascending (์ธ์๋ bool ๋๋ bool์ ๋ฆฌ์คํธ(0 ๋๋ 1์ ๋ด์ ๋ฆฌ์คํธ ๊ฐ๋ฅ) / ๊ธฐ๋ณธ๊ฐ์ True)
:์ ๋ ฌ ์์๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ ์ง ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ ์ง ์ง์ ํ๋ ์ธ์df.sort_values('์์ด', ascending=False) # ์์ด ์ด ๊ธฐ์ค ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ โ # ์ํ์ผ๋ก ์ ๋ ฌํ๋ ์ํ์ด ๋์ ์ด๋ฉด ๊ณผํ์ผ๋ก ์ ๋ ฌ (๋ชจ๋ ๋ด๋ฆผ์ฐจ์) df.sort_values(['์ํ', '๊ณผํ'], ascending=False) โ # ์ํ์ผ๋ก ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ ์ํ์ด ๋์ ์ด๋ฉด ๊ณผํ์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ # ascending์ ์ธ์๋ก bool์๋ฃํ์ด ์์ผ ํ๋, sort_valuse๋ ํน์ดํ๊ฒ 0 ๋๋ 1์ด ๋ด๊ธด ๋ฆฌ์คํธ ๋ฃ์ ์ ์์ df.sort_values(['์ํ', '๊ณผํ'], ascending=[0, 1])
# A๋ถํฐ F ์์๋ก ์ ๋ ฌ(category๋ผ์ ๋ด๋ฆผ์ฐจ์) df['ํ์ '].value_counts().sort_index(ascending=False)
โ
- [pandas] rename
- index (์ธ์๋ mapper)
: index์ ์ด๋ฆ์ ๋ฐ๊พธ๋ ์ธ์mapper๋? ๋์ ๋๋ฆฌ/์๋ฆฌ์ฆ/ํจ์์ ๊ฐ์ด, ํ๋์ ๊ฐ์ ๋ฆฌํดํ๊ธฐ์ ๋งตํ์ ํ ์ ์๋ ๋งค๊ฐ์ฒด
โ
- columns (์ธ์๋ mapper)
: columns์ ์ด๋ฆ์ ๋ฐ๊พธ๋ ์ธ์
- level (์ธ์๋ level์ ๋ก์ผ์ด์ ํน์ ๋ ์ด๋ธ / ๊ธฐ๋ณธ๊ฐ์ None)
: ๋ฉํฐ์ธ๋ฑ์ค์์ ์ด๋ฆ์ ๋ฐ๊ฟ ๋ ๋ฒจ์ ์ง์ ํ๋ ์ธ์๊ธฐ๋ณธ๊ฐ์ ๋ชจ๋ level์์ ์ด๋ฆ์ ๋ฐ๊พผ๋ค.
df2.rename(columns={'์ ํ':'์๋ฃ'})
- [pandas] reset_index
๊ธฐ์กด index๋ฅผ index์์ ์ ๊ฑฐํ๋ ํจ์- index์์๋ง ์ ๊ฑฐํ๊ณ ๋ฐ์ดํฐ ํ๋ ์์ ์ด๋ก ๋ง๋ค๊ธฐ ๊ฐ๋ฅ - index ์ ๊ฑฐ๋ง๋ ๊ฐ๋ฅํ๋ค - ๋ชจ๋ index๊ฐ ์ ๊ฑฐ๋์ด index๊ฐ ์๋ค๋ฉด ์๋ก์ด RangeIndex๊ฐ ์์ฑ๋๋ค - ํํฐ๋ง ํ ์๋ก์ด RangeIndex๋ฅผ ๋ถ์ฌํ ๋ ์ฌ์ฉํ๋ฉด ๋๋ค ๐๐๐
โ
- level (์ธ๋ฑ์ค์ ๋ ๋ฒจ / ๋ก์ผ์ด์ ํน์ ๋ ์ด๋ธ ๋ชจ๋ ๊ฐ๋ฅํ๋ค / ๊ธฐ๋ณธ๊ฐ์ ๋ชจ๋ ๋ ๋ฒจ)
: ๋ฉํฐ ์ธ๋ฑ์ค์์ ๋ฆฌ์ ํ ์ธ๋ฑ์ค์ ๋ ๋ฒจ์ ๊ฒฐ์ ํ๋ค
โ
- drop (์ธ์๋ bool / ๊ธฐ๋ณธ๊ฐ์ False)
: index์์๋ง ์ญ์ ํ๊ณ ๋ฐ์ดํฐ๋ ๋ฐ์ดํฐํ๋ ์์ ์ด๋ก ๋ง๋ค ๊ฒ์ธ์ง
์ด๋ก๋ ๋ง๋ค์ง ์๊ณ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ ๊ฒ์ธ์ง ์ง์ ํ๋ ์ธ์.๊ธฐ๋ณธ๊ฐ์ ์ด๋ก ๋ง๋ ๋ค (drop ํ์ง ์๋๋ค)
# df2์ index๋ฅผ ์ด๋ก ๋ง๋ค์ df2.reset_index() โ # ํํฐ๋ง ํ ์๋ก์ด RangeIndex๋ฅผ ๋ถ์ฌํ ๋ ์ฌ์ฉ df1[df1['์ ์'] > 90].reset_index(drop=True)
- [pandas] stack
: ์ธ๋ฑ์ค์ ๊ตฌ์กฐ๋ฅผ ๋ฐ๊พธ๋(columns๋ฅผ index๋ก ๋ณด๋ด๋) ํจ์
- level (level์ ๋ ์ด๋ธ ํน์ ๋ก์ผ์ด์ , ๋๋ ๊ทธ๊ฒ๋ค์ ๋ฆฌ์คํธ/๊ธฐ๋ณธ๊ฐ์ -1)
: index๋ก ๋ณด๋ผ columns์ level์ ์ง์ ํ๋ ์ธ์๊ธฐ๋ณธ๊ฐ์ -1์ด๋ผ์ ๋งจ ๋ง์ง๋ง columns๋ฅผ ๋ณด๋ธ๋ค
โ
- dropna (์ธ์๋ bool / ๊ธฐ๋ณธ๊ฐ์ True)
: ๊ฐ์ด NaN์ธ ํ์ ์์ฑํ์ง ์๊ณ ์ญ์ ํ๋ ์ธ์# stack์ผ๋ก df1์ ๊ตฌ์กฐ ๋ฐ๊พธ๊ธฐ df1.stack() โ # stack์ผ๋ก level์ ์ง์ ํด df1์ ๊ตฌ์กฐ ๋ฐ๊พธ๊ธฐ df1.stack(0) โ # stack์ผ๋ก level์ ๋ณต์๋ก ์ง์ ํ๊ธฐ df1.stack([0, 1])
- [pandas] unstack
- level (level์ ๋ ์ด๋ธ ํน์ ๋ก์ผ์ด์ , ๋๋ ๊ทธ๊ฒ๋ค์ ๋ฆฌ์คํธ / ๊ธฐ๋ณธ๊ฐ์ -1)
: columns๋ก ๋ณด๋ผ index์ level์ ์ง์ ํ๋ ์ธ์๊ธฐ๋ณธ๊ฐ์ -1์ด๋ผ์ ๋งจ ๋ง์ง๋ง index๋ฅผ ๋ณด๋ธ๋ค
โ
- fill_value
: NaN์ ๋์ฒดํ ๊ฐ์ ์ง์ ํ๋ ์ธ์
- [pandas] set_axis
: ์ฃผ์ด์ง ์ถ์ ์ํ๋ ์ธ๋ฑ์ค๋ฅผ ํ ๋นํ๋ ํจ์df.index ๋ df.columns์ ์ํ๋ ์ธ๋ฑ์ค๋ฅผ ๋ฐฐ์ ํ๋ ๊ฒ๊ณผ ๋์ผํ๋, ํจ์์ด๊ธฐ ๋๋ฌธ์ ์๋ณธ์ ๋ฎ์ด์ฐ์ง ์๋๋ค
โ
- labels (๋ฐฐ์ด์ด๋ ์ธ๋ฑ์ค)
: ์๋ก์ด ์ธ๋ฑ์ค๋ก ๋ง๋ค๊ณ ์ถ์ ๋ฐ์ดํฐ
โ
- axis (0 or 1 / ๊ธฐ๋ณธ๊ฐ์ 0)
: index๋ฅผ ๋ฐ๊ฟ ๊ฒ์ธ์ง columns๋ฅผ ๋ฐ๊ฟ ๊ฒ์ธ์ง ์ง์ ํ๋ ์ธ์๊ธฐ๋ณธ๊ฐ์ 0์ด๊ณ index๋ฅผ ํ ๋นํ๋ค
# df1์ columns๋ฅผ ์์ด๋ก ๋ฐ๊พธ๊ธฐ df1.set_axis(['name', 'score', 'class'], axis=1) # df.columns = ['name', 'score', 'class']์ ๋์ผ(๋ฎ์ด์ฐ๋ ์๋๋์ ์ฐจ์ด)
โ
- [pandas] rank
: ๋ฐ์ดํฐ ํ๋ ์์ด๋ ์๋ฆฌ์ฆ์ ์์๋ฅผ ๋งค๊ธฐ๋ ํจ์
- method (์ธ์๋ โaverageโ, โminโ, โmaxโ, โfirstโ, โdenseโ / ๊ธฐ๋ณธ ๊ฐ์ โaverageโ)
: ๋์ ์ ์ฒ๋ฆฌ๋ฐฉ์์ ์ง์ ํ๋ ์ธ์- average: ํ๊ท ์์ - min: ์ต์ ์์ - max: ์ต๋ ์์ - first: ์ถํ ์์์ ๋ฐ๋ผ ์์ ๋ถ์ฌ # # ์ ๋ ฌ ๊ธฐ์ค์ ์ํฅ์ ๋ฐ์ ์์ ๋งค๊น - dense: โminโ๊ณผ ๊ฐ์ง๋ง ๋์ ์๊ฐ ์ฌ๋ฌ๋ช ์์ด๋ ๋ค์ ์์๋ 1์ ๋ํด๋ถ์ฌ ex. 90, 89, 89, 88์ ๊ฐ๊ฐ 1, 2, 2, 3 ๋ถ์ฌ(88์ ์ 4์๊ฐ ์๋ 3์ ๋ถ์ฌ)
โ
- ascending (์ธ์๋ bool / ๊ธฐ๋ณธ ๊ฐ์ True)
: ์ค๋ฆ์ฐจ์๊ณผ ๋ด๋ฆผ์ฐจ์์ ๊ฒฐ์ ํ๋ ์ธ์๊ธฐ๋ณธ๊ฐ์ ์ค๋ฆ์ฐจ์
df['์์ด'].rank(ascending=False) # ์์ด์ด ๊ธฐ์ค ๋ด๋ฆผ์ฐจ์์ผ๋ก ๋ฑ์ ๋งค๊ธฐ๊ธฐ df1['๊ตญ์ด'].rank(method='min')
- [pandas] mask
: True or False(bool)์ ๋ฐ๋ผ ๊ฐ์ ์์ฐ๋(masking) ํจ์
(์ฆ ๋ถ๋ฆฌ์ธ ๋ง์คํน์ ํ๋ ํจ์ (boolean masking))
- cond (์ธ์๋ bool ์๋ฆฌ์ฆ, ๋ฐ์ดํฐํ๋ ์)
์กฐ๊ฑด๋ฌธ์ฒ๋ผ ์๋ํ๋ True ๋๋ False์ ๋ฐฐ์ด์ ์ ๋ ฅ๋ฐ๋ ์ธ์- mask ํจ์๋ True์ผ ๋์ ๊ฐ์ ๋ฐ๊พผ๋ค. - ๋ณ์๋ก ์ง์ ๊ฐ๋ฅํ๋ค
โ
- other (์ธ์๋ ์ค์นผ๋ผ , ์๋ฆฌ์ฆ, ๋ฐ์ดํฐํ๋ ์, ํจ์ / ๊ธฐ๋ณธ๊ฐ์ nan)
์กฐ๊ฑด๋ฌธ์ด True์ผ ๋ ๋ฐ๊ฟ ๊ฐ์ ์ง์ ํ๋ ์ธ์. ๊ธฐ๋ณธ๊ฐ์ NaN์ด๋คcond1 = df > 80 df.mask(cond1, 'ํฉ๊ฒฉ').mask(~cond1, '๋ถํฉ๊ฒฉ') โ cond2 = df1['๊ตญ์ด'] <= 80 df1['๊ตญ์ด์ฑ์ '] = df1['๊ตญ์ด'].mask(cond2, '๋ถํฉ๊ฒฉ').mask(~cond2, 'ํฉ๊ฒฉ') df1['๊ตญ์ด์ฑ์ '] = np.where(cond2, '๋ถํฉ๊ฒฉ','ํฉ๊ฒฉ') # ์์ ๋์ผ โ cond3 = df1['์์ด'] > df1['๊ตญ์ด'] df1['๊ตญ์ด'] = df1['๊ตญ์ด'].mask(cond3, df1['์์ด']) #other ๋งค๊ฐ๋ณ์์ Series ๊ฐ๋ฅ
- [pandas] cut
: ์ซ์์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ๊ฐ๋ณ๋ก ๋๋ ์ ๋ฒ์ฃผํ(categorization)ํ๋ ํจ์
- x (์ธ์๋ ๋ฐฐ์ด)
: ๊ตฌ๊ฐ์ ๋๋ ๋ฐฐ์ด์ ์ ๋ ฅ๋ฐ๋ ์ธ์๋ฐ๋์ 1์ฐจ์์ด์ด์ผ ํ๋ค
โ
- bins (์ธ์๋ ์ ์, ์์์ ๋ฐฐ์ด)
: ๊ตฌ๊ฐ์ ๋๋๋ ๊ธฐ์ค์ ์ ๋ ฅ๋ฐ๋ ์ธ์- ์ ์ : ์ ์๋งํผ์ ๊ท ๋ฑํ ๊ตฌ๊ฐ์ผ๋ก ๋ถํ ํ๋ค - ์์์ ๋ฐฐ์ด : ex1) [0, 20, 40, 60] ์ด๋ผ๋ฉด 0 ~ 20, 20 ~ 40, 40 ~ 60 ๊น์ง์ 3๊ฐ์ ๊ตฌ๊ฐ์ผ๋ก ๋ถํ ํ๋ค
โ
- right (์ธ์๋ bool / ๊ธฐ๋ณธ๊ฐ์ True)
: ๊ตฌ๊ฐ์์ ์ฐ์ธก ๊ฒฝ๊ณ๋ฅผ ํฌํจํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ์ธ์์๋ฅผ ๋ค์ด, right=True๋ฉด 0์ด๊ณผ 20์ดํ, 20์ด๊ณผ 40์ดํ, 40์ด๊ณผ 60์ดํ๋ก ๋ถํ ํ๋ค
โ
- labels (์ธ์๋ ๋ฐฐ์ด ๋๋ False / ๊ธฐ๋ณธ๊ฐ์ None)
: ๊ตฌ๊ฐ์ ๋ ์ด๋ธ์ ์ง์ ํ๋ ์ธ์- False๋ ๊ฐ์ฅ ์ผ์ชฝ ๊ตฌ๊ฐ๋ถํฐ 0, 1, 2, 3... ์ผ๋ก ๋ ์ด๋ธ์ ๋ถ์ฌํ๋ค - ๊ธฐ๋ณธ๊ฐ์ ๊ตฌ๊ฐ์ ๊ฒฝ๊ณ๋ฅผ ๊ตฌ๊ฐ์ ๋ ์ด๋ธ๋ก ๋ถ์ฌํ๋ค - ์๋ฅผ ๋ค์ด, (0, 20], (20, 40], (40. 60] ์ผ๋ก ๋ถ์ฌํ๋ค - ๋ฐ๋์ bins ์ธ์๋ก ๋๋์ด์ง ๊ตฌ๊ฐ์์ ๊ฐ์์ผ ํ๋ค
s = pd.Series([71, 92, 77, 70]) โ # ๊ตฌ๊ฐ ๋ถ๋ฅํด ๋ ์ด๋ธ์ ์ฝ๋ํ ํ๊ธฐ pd.cut(s, [0, 70, 80, 90, 100], labels=False) โ # ๊ตฌ๊ฐ ๋ถ๋ฅํด ์ง์ ํ ๋ ์ด๋ธ์ ๋ถ์ฌํ๊ธฐ pd.cut(s, [0, 70, 80, 90, 100], labels=['F', 'C', 'B', 'A'])
- [pandas] apply
: ๋ฐ์ดํฐ ํ๋ ์์ด๋ ์๋ฆฌ์ฆ์ ๊ฐ๋ณ ์์ ๊ฐ๊ฐ์ ํจ์๋ฅผ ์ ์ฉํด์ฃผ๋ ํจ์- ๋ฐ์ดํฐ ํ๋ ์์ ์๋ฆฌ์ฆ ๋จ์๋ก ํจ์ ์ ์ฉ - ์๋ฆฌ์ฆ๋ ์ ๋จ์๋ก ํจ์ ์ ์ฉ
โ
- func (์ธ์๋ ํจ์)
: ๊ฐ๋ณ ์์์ ์ ์ฉํ ํจ์๋ฅผ ์ ๋ ฅํ๋ ์ธ์
โ
- axis (์ธ์๋ 0 or 1 / ๊ธฐ๋ณธ๊ฐ์ 0)
: (DataFrame์ apply ์ ์ฉํ์ฌ Series๋ณ๋ก ํจ์๋ฅผ ์ ์ฉํ ๋)
๊ฐ๋ณ Series๋ฅผ ๊ฒฐ์ ํ๋ ์ถ์ ์ง์ ํ๋ ์ธ์- 0 : ์ด๋ง๋ค ํจ์ ์ ์ฉ(ํ ๊ธฐ์ค) - 1 : ํ๋ง๋ค ํจ์ ์ ์ฉ(์ด ๊ธฐ์ค)
df['์ญ์'] = df['๋ต์'].apply(lambda x: x[::-1]) โ # ์๋ฆฌ์ฆ์๋ง ์ ์ฉ๋๋ pd.to_numeric์ ๋ฐ์ดํฐํ๋ ์์ ์ ์ฉํ๋ ค๋ฉด apply ํ์ df.apply(pd.to_numeric, errors='coerce') โ # ๋ฐ์ดํฐ ํ๋ ์์ apply๋ฅผ ์ ์ฉํ ๋ ์ถ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ ์ฉ๋๋ค df2.apply(lambda x: x[:2]) # ํ ์ฌ๋ผ์ด์ฑ df2.apply(lambda x: x[:2], axis=1) # ์ด ์ฌ๋ผ์ด์ฑ โ # ๋ ์ด์์ ์ด์ ๋ํด ํ๋จ์๋ก ํจ์๋ฅผ ์ ์ฉํ ๋๋ ๋ฐ์ดํฐํ๋ ์์ apply๋ฅผ ์ ์ฉํ ์ ์๋ค df3['๊ฐ๊ฒฉ'] = df3.apply(lambda x: df4.loc[x['์ ํ'], x['ํ ์ธ์ฌ๋ถ']], axis=1)
- apply vs. map
# ์๋ฆฌ์ฆ์ apply ์ ์ฉํ๊ธฐ s1.apply(lambda x: int(x[:-1])) โ # map ํจ์๋ ์๋ฆฌ์ฆ์ ์ ์ฉํ ๋ apply์ ์ ์ฌํ๋ค s1.map(lambda x: int(x[:-1])) โ # map ํจ์๋ ํจ์๋์ ๋งตํผ๋ฅผ ์ ๋ ฅ๋ฐ์ ์ ์๋ค s2.map(s3) โ # apply๋ ๋งตํผ๋ฅผ ์ ๋ ฅ๋ฐ์ง ๋ชปํ์ง๋ง lambda ํจ์๋ก ์ ์ฌํ ๊ธฐ๋ฅ ๊ฐ๋ฅ s2.apply(lambda x: s3[x]) โ print(s2) print(s3)
- apply vs. applymap
df
# applymap์ apply์ ๋ฌ๋ฆฌ ๋ฐ์ดํฐ ํ๋ ์๋ ์ ๋ง๋ค ํจ์๋ฅผ ์ ์ฉํ๋ค df.applymap(lambda x: int(x[:-1]))
# ์ ๊ฒฐ๊ณผ๋ฅผ apply๋ก ์ป์ผ๋ ค๋ฉด map ํจ์๋ฅผ ํ๋ฒ ๋ ์ฌ์ฉํด์ผ ํ๋ค df.apply(lambda x: x.map(lambda y: int(y[:-1])))
- [pandas] shift
: ๋ฐ์ดํฐ๋ฅผ ์ ํด์ง ์นธ๋งํผ ์ด๋์ํค๋ ํจ์
- periods (์ ์)
: ์ด๋ํ ์นธ์ ์ง์ ํ๋ ์ธ์(๊ธฐ๋ณธ๊ฐ์ 1)
- freq
: ๋ ์ง๋ ์๊ฐ ๋ฐ์ดํฐ๋ฅผ shift ํ ๋ ์ฌ์ฉํ๋ ์ธ์
- axis (0 or 1)
์ด๋ ๋ฐฉํฅ์ ์ง์ ํ๋ ์ธ์(๊ธฐ๋ณธ๊ฐ์ 0)# ๋ฐ์ดํฐ ํ๋ ์์ shift ํจ์ ์ ์ฉํ๊ธฐ df.shift()
# shift ํจ์์ ์์ ์ ๋ ฅํ๊ธฐ df.shift(-1)
# ์๋ฆฌ์ฆ๋ฅผ shiftํด์ ๊ฐ๊ฒฉ๋ณ๋ ์ด ๋ง๋ค๊ธฐ df1['๊ฐ๊ฒฉ๋ณ๋'] = df1['๊ฐ๊ฒฉ'] - df1['๊ฐ๊ฒฉ'].shift() โ # diff ํจ์๋ก ๊ฐ๊ฒฉ๋ณ๋ ์ด ๋ง๋ค๊ธฐ df1['๊ฐ๊ฒฉ๋ณ๋'] = df1['๊ฐ๊ฒฉ'].diff() # ์์ ๋์ผ โ # ์๋ฆฌ์ฆ๋ฅผ shiftํด์ ๋ณ๋๋ฅ ์ด ๋ง๋ค๊ธฐ df1['๋ณ๋๋ฅ '] = (df1['๊ฐ๊ฒฉ'] - df1['๊ฐ๊ฒฉ'].shift()) / df1['๊ฐ๊ฒฉ'].shift() โ # pct_change ํจ์๋ก ์ด ๋ง๋ค๊ธฐ df1['๋ณ๋๋ฅ '] = df1['๊ฐ๊ฒฉ'].pct_change() # ์์ ๋์ผ
โ
- [pandas] explode
: ๋ฐ์ดํฐํ๋ ์์ด๋ ์๋ฆฌ์ฆ์ ์ ์์ ์๋ ๋ฆฌ์คํธ์ ๋ฐ์ดํฐ๋ฅผ ํ์ฅํ๋ ํจ์
- column
: ํ์ฅ ์ํฌ ์ด์ ์ง์ ํ๋ ์ธ์
โ
- ignore_index
: ์๋ก์ด index๋ฅผ ๋ถ์ฌํ ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ์ธ์(๊ธฐ๋ณธ๊ฐ์ False)ignore_index=True์ธ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ๊ฐ ํ์ฅ๋๋ฉด์ ์ธ๋ฑ์ค๊ฐ ์ค๋ณต๋๋๋ฐ, ์ด๋ ์๋ก์ด index ๋ถ์ฌ
df1
df1.explode('์ด๋ฆ') # ignore_index=True๋ก ํ๊ฑฐ๋, reset_index()๋ก ์๋ก์ด ์ธ๋ฑ์ค ๋ถ์ฌ ํ์
# ์ด๋ฆ์ด์ /๋ฅผ ๋ถ๋ฆฌํด์ ๋ฆฌ์คํธ๋ก ๋ง๋ค๊ณ explode๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ฒ๋ฆฌ๋๋ค df2['์ด๋ฆ'] = df2['์ด๋ฆ'].str.split('/') df2.explode('์ด๋ฆ') โ # ์ํ์ผ๋ก ๋์ด๋ ๋ค์ด๋ฒ ์นํฐ์ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด ์๊ฐ ์ค์ฌ์ผ๋ก ํด๋น ์๊ฐ์ ์ํ์ ๋ฌถ๊ธฐ df_ex2['author'] = df_ex2['author'].str.split(' / ') df_ex2.explode('author').groupby('author', as_index=False)['title'].agg(' / '.join)
โ
- [pandas] to_datetime
: ์๋ฃํ์ datetime์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ ํจ์
- arg (datetime์ผ๋ก ๋ณํ ๊ฐ๋ฅํ ๋ฐ์ดํฐ)
: datetime์ผ๋ก ๋ณํํ ๋ฐ์ดํฐ
โ
- errors (์ธ์๋ โignoreโ, โraiseโ, โcoerceโ / ๊ธฐ๋ณธ๊ฐ โraiseโ)
: ์๋ฌ ์ฒ๋ฆฌ ๋ฐฉ์- 'raise' : ๋ณํํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ฉด ์๋ฌ๋ฅผ ์ผ์ผํจ๋ค - 'coerce' : ๋ณํํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ฉด ํด๋น ๋ถ๋ถ๋ง NaT์ผ๋ก ๋ฐ๊พธ๊ณ ๋ณํ์ ์ํํ๋ค. - 'ignore' : ๋ณํํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ฉด ๋ชจ๋ ๋ณํํ์ง ์๊ณ ๊ทธ๋ฅ input์ ๊ทธ๋๋ก ๋ฐํํ๋ค
โ
- format (str, ๊ธฐ๋ณธ๊ฐ None)
: ๋ฌธ์์ด์ด ์ด๋ค ๋ ์งํ์ ๋ํ๋ด๋์ง ํ์์ ์ง์ ํ๋ ์ธ์์) 2023๋ 1์ 3์ผ์ด '03/01/2023'์ผ๋ก ํํ๋์ด ์๋ ๋ฐ์ดํฐ๋ผ๋ฉด '%d/%m/%Y'๋ก ํํํ๋ค
โ
- unit (str, ๊ธฐ๋ณธ๊ฐ์ 'ns')
: Timestamp๊ฐ ์ซ์๋ก ์ฃผ์ด์ง ๋ ์ซ์์ ๊ธฐ๋ณธ๋จ์. ๊ธฐ๋ณธ๊ฐ์ nano second
โ
- origin (scalar, ๊ธฐ๋ณธ๊ฐ 'unix')
: Timestamp๊ฐ ์ซ์๋ก ์ฃผ์ด์ง ๋ ๊ธฐ์ค ๋ ์ง.- unit์์ ์ ํ ๋จ์๋งํผ์ ์ซ์๋ฅผ ๊ธฐ์ค ๋ ์ง์์ ๋ํ๋ค ์) origin์ผ๋ก 1970-01-01์ ๊ธฐ์ค์ผ๋ก ์ ํ๊ณ unit๊ฐ D๋ผ๋ฉด ์ซ์1์ ๊ธฐ์ค์ด๋ถํฐ 1์ผ ์ง๋ ํ์ธ 1970-01-02๋ฅผ ์๋ฏธํ๋ค - 'unix' (or POSIX) : origin ์ 1970-01-01. - 'julian' : BC 4713๋ 1์ 1์ผ ์ ์ค. unit๋ 'D'์ฌ์ผ ํ๋ค - Timestamp ๋ก ๋ณํ๊ฐ๋ฅํ ๋ฌธ์์ด์ ๋ฃ์ด๋ ๋๋ค
# to_datetime ํจ์๋ก timestamp๋ก ๋ณ๊ฒฝํ๊ธฐ pd.to_datetime(df['๋ ์ง']) โ # astype ํจ์๋ก timestamp๋ก ๋ณ๊ฒฝํ๊ธฐ (์ ์ฐ์ง ์๋๋ค) df['๋ ์ง'].astype('datetime64[ns]') โ # to_datetime ํจ์์ ์ฅ์ (๋ฐ๊ฟ ์ ์๋ ๋ฐ์ดํฐ๋ NaT๋ก ๋ฐ๊พผ๋ค) s = pd.Series(['2022-01/03', '๊นํ๋ค']) pd.to_datetime(s, errors='coerce')
# df๋ฅผ ๋ณต์ ํ df1์ผ๋ก ๋ ์ง์ด์ datetime์ผ๋ก ๋ฐ๊พธ์ df1 = df.copy() df1['๋ ์ง'] = pd.to_datetime(df1['๋ ์ง']) โ # ์๋ฃํ์ ๋ฐ๊พผ ๋ ์ง์ด์ index๋ก ์ง์ df1 = df1.set_index('๋ ์ง')
# 2023-02์ ์๋ฃ๋ง ๊ฐ์ ธ์ค๊ธฐ df1.loc['2023-02'] # ๋จ์์ ๋ฌธ์์ด์ด๋ผ df1['2023-02']์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค loc์ฌ์ฉ โ # 2023-02 ๋ถํฐ ์๋ฃ๋ฅผ ์ฌ๋ผ์ด์ฑํด์ ๊ฐ์ ธ์ค๊ธฐ df1.loc['2023-02':]
- ํ์ผ์์ ๋ฐ์ดํฐ ํ๋ ์์ ๋ถ๋ฌ์ฌ ๋ datetime ์๋ฃํ์ผ๋ก ์ง์ ํ๊ธฐ
: read_csv๋ read_excel์ parse_dates ์ธ์์ ํด๋น ์ด์ ๋ฆฌ์คํธ๋ก ์ ๋ ฅํ๋ค(๋จ๋ ์ด์ด๋ ๋ฆฌ์คํธ๋ก ์ ๋ ฅ)# csvํ์ผ์์ ๋ถ๋ฅผ๋ datetime์ผ๋ก ์ง์ ํ๊ณ index๋ก ์ง์ ํ๊ธฐ df_ex1 = pd.read_csv(url, parse_dates=['์๊ฐ'], index_col=0) โ # 2022๋ 6์ 1์ผ ๋ฐ์ดํฐ๋ง ์ธ๋ฑ์ฑ df_ex1.loc['2022-06-01'] โ # 2022๋ 6์ 1์ผ 23์์ ๋ฐ์ดํฐ๋ง ์ธ๋ฑ์ฑ df_ex1.loc['2022-06-01 23'] โ # 2022๋ 6์ 1์ผ 23์ 00๋ถ์ ๋ฐ์ดํฐ๋ง ์ธ๋ฑ์ฑ df_ex1.loc['2022-06-01 23:00'] โ # 2022-06-02 ๋ถํฐ 2022-06-04๊น์ง ์ฌ๋ผ์ด์ฑ df_ex1.loc['2022-06-02':'2022-06-04']
- [pandas] date_range
: ํน์ ์ฃผ๊ธฐ์ DatetimeIndex๋ฅผ ๋ง๋๋ ํจ์
- start
: ๋ฐฐ์ด์ ์์
- end
: ๋ฐฐ์ด์ ๋
- periods (int, optional)
: ์์ฑํ ๋ฐฐ์ด์ ๊ฐ์
- freq (์ฃผ๊ธฐ / ๊ธฐ๋ณธ๊ฐ โDโ)
: ์์ฑํ ๋ฐ์ดํฐ์ ์ฃผ๊ธฐ
# ์์์ผ๊ณผ ๋์ผ ์ฌ์ด์ ๋ชจ๋ ๋ ์ง pd.date_range('2022-01-03', '2022-01-10') โ # ์์์ผ๋ถํฐ ์ง์ ๋ ๊ฐ์์ ๋ฐฐ์ด (๋ ์ง) pd.date_range('2022-01-03', periods=3) โ # ๊ฒฐ๊ณผ๊ฐ index์ธ ์๋ฆฌ์ฆ ๋ง๋ค๊ธฐ idx = pd.date_range('2022-01-03', periods=3) pd.Series([0, 1, 2], index=idx) โ # DatetimeIndex์ด์ง๋ง ์๋ฆฌ์ฆ๋ก ๋ง๋ค ์ ์๊ณ ๋ฐ์ดํฐํ๋ ์์ ์ด๋ก ๋ง๋ค ์๋ ์๋ค pd.Series(pd.date_range('2022-01-03', periods=3)) โ # ์ฃผ๊ธฐ ๋ฐ๊พธ๊ธฐ (์์ ๋ง์ง๋ง๋ ) pd.date_range('2022-01-03', periods=3, freq='M') โ # ์ฃผ๊ธฐ ๋ฐ๊พธ๊ธฐ (์์ ์ฒซ๋ ) pd.date_range('2022-01-03', periods=3, freq='MS') โ # ์ฃผ๊ธฐ ๋ฐ๊พธ๊ธฐ (2๊ฐ์ ์ฃผ๊ธฐ์ ๋ง์ง๋ง๋ ) pd.date_range('2022-01-03', periods=3, freq='2M') โ # ์ฃผ๊ธฐ ๋ฐ๊พธ๊ธฐ (๋ ๋๋ณ ๋ง์ง๋ง๋ ) pd.date_range('2022-01-03', periods=3, freq='Y') โ # ์ฃผ๊ธฐ ๋ฐ๊พธ๊ธฐ (10๋ถ)) pd.date_range('2022-01-03', periods=10, freq='10T')
- dt ์ ๊ทผ์
dt ์ ๊ทผ์์ ์ฌ์ฉํด์ datetime์ ํน์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์์ฑ๊ณผ ํจ์๋ค
df1
df1['date'].dt.year # ์ฐ๋ df1['date'].dt.quarter # ์ฟผํฐ df1['date'].dt.month # ์ df1['date'].dt.day # ์ผ df1['date'].dt.hour # ์๊ฐ df1['date'].dt.minute # ๋ถ df1['date'].dt.second # ์ด โ # df1์ date์ด์ ์๊ฐ๋ง ์ถ์ถ (๊ฒฐ๊ณผ๋ object) df1['date'].dt.time โ # df1์ date์ด์ ๋ ์ง๋ง ์ถ์ถ (๊ฒฐ๊ณผ๋ object) df1['date'].dt.date โ # ๋ ์ง๋ง ํ์ (datetime์ ์๊ฐ์ 00:00:00์ผ๋ก ๋ง๋ ๋ค) df1['date'].dt.normalize() โ # ์ฐ๋ ์ฃผ ์์ผ์ ๋ฐ์ดํฐ ํ๋ ์์ผ๋ก(์ฃผ๋ก ์ฃผ๋ฅผ ์ถ์ถํ ๋ ์ด๋ค) df1['date'].dt.isocalendar()
df2
# df2์ index(DatetimeIndex)์์ ์ฐ๋๋ง ์ถ์ถ (dt์ ๊ทผ์๊ฐ ํ์ ์๋ค) df2.index.year
# ํ๊ธฐํ์ ๋ฐ๊พธ๊ธฐ df1['date'].dt.strftime('%y/%m/%d [%a]')
# ์ฐ๋์ ํฉ์ณ์ง ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋๋ strftime์ ์ด๋ค df1['date'].dt.strftime('%Y-%m')
# ์ฐ๋๊ฐ ํฌํจ๋ ์์ ์ป๊ณ ์ถ๋ค๋ฉด period ์๋ฃํ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ ํํ๋ค df1['date'].dt.to_period('M')
# ์ฐ๋๊ฐ ํฌํจ๋ ์ฟผํฐ๋ฅผ ์ป์ ๊ฒฝ์ฐ๋ ์๊ณ์ด์ ์ ์งํ๋ ค๋ฉด period ์๋ฃํ์ ์ด๋ค df1['date'].dt.to_period('Q')
- [pandas] resample
df1
# ์๋ณ ์ง๊ณ df1.resample(rule='M', on='๋ ์ง')['๊ธ์ก'].sum()
# timestamp๋ฅผ ์์ ์ฒซ๋ ๋ก ๋ฐ๊ฟ๋ณด์ df1.resample('MS', on='๋ ์ง')['๊ธ์ก'].sum()
# ์๊ณ์ด resample๊ณผ groupby๋ฅผ ํจ๊ป ์ฌ์ฉํ ๋ (groupby๋ถํฐ ์ฌ์ฉํ๋ค) df1.groupby('๊ตฌ๋ถ').resample('M', on='๋ ์ง')['๊ธ์ก'].sum().unstack(level=0)
# ์ค์ต์ ์ฐ์ผ df2๋ ์ธ๋ฑ์ค๊ฐ DatetimeIndex์ด๋ค df2
# DatetimeIndex์ผ ๋๋ on์ ์ง์ ์ด ํ์์๋ค df2.resample('MS')['๊ธ์ก'].sum()
df_ex1
# ์ผ์๋ณ ์ด ํ๋์ ํ์ ์ง๊ณ df_ex1.resample('D')['๊ฐ๊ฒฉ'].count() # null๊ฐ์ด ์๋ ์ด์ด๋ผ๋ฉด '๊ฐ๊ฒฉ' ์๋ฆฌ์ ๋ค๋ฅธ ์ด์ด ๋ค์ด์ฌ ์ ์๋ค(ํจ์๊ฐ count์ด๊ธฐ ๋๋ฌธ)
# ๊ฐ๋จํ๊ฒ ์๊ฐํ df_ex1.resample('D')['๊ฐ๊ฒฉ'].count().rename_axis('').plot(kind='bar')
# ์ผ์๋ณ ํ๋ ์ ํ๋ณ๋ก ํ์๋ฅผ ์ง๊ณ df_ex1.groupby('ํ๋').resample('D')['๊ฐ๊ฒฉ'].count().unstack(level=0)
โ
- DataFrame์ด๋ Series์ ์ค์นผ๋ผ(์์)์ ์ฐ์ฐ
- ๋ชจ๋ ์์์์ ๊ฐ๊ฐ ์ฐ์ฐs1 * 2 df1 == 70
- Series ์ฌ์ด์ ์ฐ์ฐ
- ๋์ผํ index๋ผ๋ฆฌ ๊ฐ๊ฐ ์ฐ์ฐdf1['๊ตญ์ด'] + df1['์์ด']
- DataFrame ์ฌ์ด์ ์ฐ์ฐ
- ๋์ผํ index์ columns๋ผ๋ฆฌ ๊ฐ๊ฐ ์ฐ์ฐ
โ- DataFrame๊ณผ Series์ ์ฐ์ฐ
- ๋ธ๋ก๋ ์บ์คํ (broad casting)