๐Ÿง‘โ€๐Ÿ’ป [Python EDA 2] Pandas

๊น€๋ฏธ์—ฐยท2023๋…„ 8์›” 19์ผ
0

[๋‚˜๋งŒ์˜ ๋…ธํŠธ] Python EDA

๋ชฉ๋ก ๋ณด๊ธฐ
2/9
post-thumbnail

1. Pandas๋ž€

https://pandas.pydata.org/

  • ์ •ํ˜• ๋ฐ์ดํ„ฐ ๋ถ„์„์— ์ตœ์ ํ™”๋œ Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    โ€‹

2. DataFrame ๋ฐ Series

  • DataFrame : pandas์˜ 2์ฐจ์› ํ‘œ ํ˜•์‹ ๋ฐ์ดํ„ฐ(index, columns, values๋กœ ๊ตฌ์„ฑ)
  • Series : pandas์˜ 1์ฐจ์› ํ‘œ ํ˜•์‹ ๋ฐ์ดํ„ฐ(index, values๋กœ ๊ตฌ์„ฑ)
    โ€‹

3. Pandas ์‚ฌ์šฉ๋ฐฉ๋ฒ•

1) ์„ค์น˜

!pip install pandas==1.5.3

2) ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

import pandas as pd

3) ๋ฒ„์ „ ํ™•์ธ

pd.__version__

โ€‹

4. DataFrame ๋ฐ Series ์ƒ์„ฑ

1) pd.DataFrame(2์ฐจ์› ๋ฆฌ์ŠคํŠธ) / pd.Series(1์ฐจ์› ๋ฆฌ์ŠคํŠธ)

pd.Series([90, 80], index=['Julie', 'Tom'])

2) pd.DataFrame(2์ฐจ์› numpy array) / pd.Series(1์ฐจ์› numpy array)

# 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"])

3) pd.DataFrame(Series ๋‹ด๊ณ  ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ)

4) pd.DataFrame(ํŒŒ์ด์ฌ dictionary)

  • 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)

5) pd.DataFrame(dictionary ๋‹ด๊ธด ๋ฆฌ์ŠคํŠธ)

list1 = [{'name':'Tom', 'score':50}, {'name':'Julie', 'score':80}]

โ€‹

5. Pandas ๋ฐ์ดํ„ฐ ์ž…์ถœ๋ ฅ

  • ๋ฐ์ดํ„ฐ ์ž…์ถœ๋ ฅ ํ•จ์ˆ˜
  • [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)

โ€‹

6. Pandas ๋ฐ์ดํ„ฐ ๋‚ด์šฉ ํ™•์ธ

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') 

โ€‹

7. Pandas ์ธ๋ฑ์‹ฑ/์Šฌ๋ผ์ด์‹ฑ

1) ์ด๋ฆ„์œผ๋กœ ์ธ๋ฑ์‹ฑ

df['Name'] # Series ๋ฆฌํ„ด
df[['Name']] # DataFrame ๋ฆฌํ„ด

df.loc[df["Age"] > 35, ["Name", "Age"]] # ๋‚˜์ด 35์„ธ ์ดˆ๊ณผํ•œ ์‚ฌ๋žŒ์˜ ์ด๋ฆ„, ๋‚˜์ด ์ถœ๋ ฅ

2) ์œ„์น˜๋กœ ์ธ๋ฑ์‹ฑ

df.iloc[[1,2,3], 0] = "No" # 1~3๋ฒˆ์งธํ–‰, 0๋ฒˆ์งธ ์—ด์˜ ๊ฐ’์„ "No"๋กœ ๋ณ€๊ฒฝ
df.iloc[1:4, 0] = "No" # ์œ„์™€ ๋™์ผ

3) boolean ์ธ๋ฑ์‹ฑ

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 ๊ฐ’์ด ๊ฒฐ์ธก์น˜๊ฐ€ ์•„๋‹Œ ๋ฐ์ดํ„ฐ ์ถ”์ถœ

4) ๋‹ค์ค‘์š”๊ฑด boolean ์ธ๋ฑ์‹ฑ

  • ์กฐ๊ฑด์ด ๋ณต์ˆ˜์ธ ๊ฒฝ์šฐ, ๋…ผ๋ฆฌ์—ฐ์‚ฐ์„ ํ™œ์šฉ
  • Pandas๋Š” ๋…ผ๋ฆฌ ์—ฐ์‚ฐ ์‹œ, ๋ฐ˜๋“œ์‹œ ๋…ผ๋ฆฌ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ ํ•„์ˆ˜
- 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')
  • ์ •๊ทœํ‘œํ˜„์‹
^ : ์‹œ์ž‘
$ : ๋
| : ๋˜๋Š”

โ€‹

8. Pandas ๊ฒฐ์ธก์น˜ ์ œ๊ฑฐ

  • [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์ด๋ฉด ์—ด์—์„œ ๊ทผ์ ‘ํ•œ ๊ฐ’์„ ์ฑ„์šด๋‹ค

โ€‹

9. Pandas ๋ฐ์ดํ„ฐ ํ†ต๊ณ„

๐Ÿ”ฅ 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]

โ€‹

10. Pandas ํ–‰/์—ด ์ถ”๊ฐ€ ๋ฐ ์‚ญ์ œ

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ํ–‰ ์‚ญ์ œ

โ€‹

11. [Pandas ํ•จ์ˆ˜] TIP

๐Ÿ”ฅ TIP) Pandas์—์„œ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ํ•จ์ˆ˜ ์ ์šฉ ๊ฒฐ๊ณผ๊ฐ€ ์›๋ณธ์„ ๋ฎ์–ด์“ฐ์ง€ ์•Š๋Š”๋‹ค
- ๋ฎ์–ด ์“ฐ๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ• : inplace=True ์‚ฌ์šฉ (๋˜๋Š”) ๊ธฐ์กด ๋ณ€์ˆ˜์— ๋‹ค์‹œ ์ง€์ •

โ€‹

12. ๋ฌธ์ž์—ด ๋‹ค๋ฃจ๋Š” Pandas ํ•จ์ˆ˜

  • ํŠน์ง•
    - 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)')

โ€‹

13. ๋ฐ์ดํ„ฐ ํ•ฉ์น˜๋Š” Pandas ํ•จ์ˆ˜

  • [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())

โ€‹

14. ํƒ€์ž… ๋ณ€๊ฒฝ Pandas ํ•จ์ˆ˜

  • [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 ์ˆœ์„œ๋กœ ์ •๋ ฌ๊ฐ€๋Šฅ

โ€‹

15. ์ •๋ ฌ Pandas ํ•จ์ˆ˜

  • [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) 

โ€‹

16. ์ธ๋ฑ์Šค(index, columns) ๊ด€๋ จ ํ•จ์ˆ˜

  • [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']์™€ ๋™์ผ(๋ฎ์–ด์“ฐ๋ƒ ์•„๋‹ˆ๋ƒ์˜ ์ฐจ์ด)

โ€‹

17. ๊ธฐํƒ€ Pandas ํ•จ์ˆ˜

  • [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() # ์œ„์™€ ๋™์ผ

โ€‹

17. ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ฐ”๊พธ๊ธฐ

  • [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)

โ€‹

18. ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ ๊ด€๋ จ ํ•จ์ˆ˜

  • [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)

โ€‹

18. Pandas ์—ฐ์‚ฐ

  • DataFrame์ด๋‚˜ Series์™€ ์Šค์นผ๋ผ(์ƒ์ˆ˜)์˜ ์—ฐ์‚ฐ
    - ๋ชจ๋“  ์š”์†Œ์—์„œ ๊ฐ๊ฐ ์—ฐ์‚ฐ
s1 * 2
df1 == 70
  • Series ์‚ฌ์ด์˜ ์—ฐ์‚ฐ
    - ๋™์ผํ•œ index๋ผ๋ฆฌ ๊ฐ๊ฐ ์—ฐ์‚ฐ
df1['๊ตญ์–ด'] + df1['์˜์–ด']
  • DataFrame ์‚ฌ์ด์˜ ์—ฐ์‚ฐ
    - ๋™์ผํ•œ index์™€ columns๋ผ๋ฆฌ ๊ฐ๊ฐ ์—ฐ์‚ฐ
    โ€‹
  • DataFrame๊ณผ Series์˜ ์—ฐ์‚ฐ
    - ๋ธŒ๋กœ๋“œ ์บ์ŠคํŒ…(broad casting)

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด