[Pandas] ์ค๋ฌด์์ ์ฐ๋ ค๊ณ ์ ๋ฆฌํด๋ Code Snippet
์๋ณธ ๊ฒ์๊ธ: https://velog.io/@euisuk-chung/Pandas-์ค๋ฌด์์-์ฐ๋ ค๊ณ -์ ๋ฆฌํด๋-Code-Snippet
ํ์ด์ฌ์ Pandas ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๋ ๋ฐ์ดํฐ ๋ถ์ ๋ฐ ์กฐ์์ ์ํ ํ์ ๋๊ตฌ์
๋๋ค. ํนํ, ๋ฐ์ดํฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ ๋ ฌํ๊ณ ๋ถ์ํ๋ ๊ฒ์ ๋ฐ์ดํฐ ๊ณผํ์์ ์ค์ํ ๊ณผ์ ์ค ํ๋์
๋๋ค. ์ด์ ํฌ์คํธ๋ค์์๋ ๋ช ๋ฒ ๊ฐ๋
๋ฐ ์ฃผ์ ํจ์๋ค์ ์๊ฐํด๋๋ ธ๋๋ฐ์.
์ด ๊ธ์์๋ ์ฃผ๋ก ์ฌ์ฉํ๋ Pandas์ ์ ๋ ฌ ๋ฐ ๋ถ์์ ์ ์ฉํ ํ
ํฌ๋๊ณผ ํจ๊ป, ์ค๋ฌด์์ ๋ฐ๋ก ํ์ฉํ ์ ์๋ ์ค๋ํซ์ ์๊ฐํฉ๋๋ค. ๊ฐ ์ค๋ํซ์ ๋ฐ๋ก ๋ณต์ฌํ์ฌ ์ฌ์ฉํ ์ ์๋๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋, ํ์ํ ๋๋ง๋ค ๋น ๋ฅด๊ฒ ์ฐธ์กฐํด๋ณด์ธ์! (์ค์ ์ ๊ฐ ์ฐ๋ ค๊ณ ๋ง๋ค์ด๋ ๊ฒ์ ์ ๋น๋ฐ)
-
์ ๋ ฌ ์ต์
๐ sort_values()๋ก ์ปฌ๋ผ ๊ฐ ๊ธฐ์ค ์ ๋ ฌ
-
sort_values()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ํน์ ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐํ๋ ์์ ์ ๋ ฌํ ์ ์์ต๋๋ค.1 2 3 4 5
## ํน์ ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ (default: ์ค๋ฆ์ฐจ์) df_sorted = df.sort_values(by='column_name') ## ์ฌ๋ฌ ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ, ์ฒซ ๋ฒ์งธ๋ ์ค๋ฆ์ฐจ์, ๋ ๋ฒ์งธ๋ ๋ด๋ฆผ์ฐจ์ df_sorted = df.sort_values(by=['column1', 'column2'], ascending=[True, False])
๐ sort_index()๋ก ์ธ๋ฑ์ค ๊ธฐ์ค ์ ๋ ฌ
-
๋ฐ์ดํฐ ํ๋ ์์ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ ๋
sort_index()
๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฃผ๋ก ์๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ์ ์ฉํฉ๋๋ค.1 2 3 4 5
## ์ธ๋ฑ์ค๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ df_sorted = df.sort_index() ## ์ธ๋ฑ์ค๋ฅผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ df_sorted = df.sort_index(ascending=False)
๐ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ๊ณผ ์๋ณธ ์์
-
์ ๋ ฌ ์
ascending=False
์ต์ ์ ์ฌ์ฉํ์ฌ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ ์ ์์ต๋๋ค.inplace=True
์ต์ ์ ์ถ๊ฐํ๋ฉด ์๋ณธ ๋ฐ์ดํฐํ๋ ์์ด ์์ ๋ฉ๋๋ค.1 2
## ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ ๋ฐ ์๋ณธ ์์ df.sort_values(by='column_name', ascending=False, inplace=True)
๐ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ์ ํ
-
sort_values()
๋ ๊ธฐ๋ณธ์ ์ผ๋ก โquicksortโ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํฉ๋๋ค. ์์ ์ ์ธ ์ ๋ ฌ์ด ํ์ํ ๋๋ โmergesortโ๋ฅผ ์ ํํ ์ ์์ต๋๋ค.1 2
## ์์ ์ ์ธ ์ ๋ ฌ์ ์ํด mergesort ์ฌ์ฉ df_sorted = df.sort_values(by='column_name', kind='mergesort')
-
์ปฌ๋ผ ๋ณ๊ฒฝ
๋ฐ์ดํฐ ๋ถ์ ์ ์ปฌ๋ผ์ ์ด๋ฆ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์์๋ฅผ ์ฌ๋ฐฐ์นํ๋ ๊ฒ์ ๋งค์ฐ ์์ฃผ ๋ฐ์ํ๋ ์์ ์ ๋๋ค. Pandas์์๋ ๊ฐ๋จํ ๋ช ๋ น์ด๋ก ์ปฌ๋ผ ์ด๋ฆ์ ์์ ํ๊ณ , ์์๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
๐ ์ปฌ๋ผ ์ด๋ฆ ๋ณ๊ฒฝ
-
์ปฌ๋ผ์ ์ด๋ฆ์ ์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. dict๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์ปฌ๋ผ์ ์ด๋ฆ์ ๋์์ ๋ฐ๊พธ๊ฑฐ๋, ํน์ ์ปฌ๋ผ๋ง ์ ํ์ ์ผ๋ก ์์ ๊ฐ๋ฅํฉ๋๋ค.
1 2
# ์๋ณธ ๋ฐ์ดํฐํ๋ ์ ์์ (inplace=True) df.rename(columns={'old_name': 'new_name'}, inplace=True)
๐ ์ ๋ ฌ ๊ธฐ๋ฐ ์ปฌ๋ผ ์์ ๋ณ๊ฒฝ
-
์ปฌ๋ผ ์ด๋ฆ์ ์ํ๋ฒณ ์ ๋๋ ์ฌ์ ์์ผ๋ก ์ ๋ ฌํ ์ ์์ต๋๋ค.
1 2
df.columns = df.columns.sort_values() # ๋ฐฉ๋ฒ1 df.columns = sorted(df.columns) # ๋ฐฉ๋ฒ2
๐ ์ผ๋ถ ์ปฌ๋ผ ์์ ๋ณ๊ฒฝํ๊ธฐ
-
ํ์ํ ์ผ๋ถ ์ปฌ๋ผ๋ง์ ๋งจ ์์ ๋ฐฐ์นํ๊ณ ๋๋จธ์ง ์ปฌ๋ผ์ ๊ธฐ์กด ์์๋ฅผ ์ ์งํ ์ ์์ต๋๋ค.
1 2 3
# 'Date'์ 'Time' ์ปฌ๋ผ์ ๋งจ ์์ ๋ฐฐ์น desired_order = ['Date', 'Time'] df = df[desired_order + [col for col in df.columns if col not in desired_order]]
-
๋ฐ์ดํฐ ํํฐ๋ง
๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ ๋ ํน์ ์กฐ๊ฑด์ ๋ง๋ ๋ฐ์ดํฐ๋ง ์ถ์ถํ๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํฉ๋๋ค.
๐ ๋จ์ผ ์กฐ๊ฑด ํํฐ๋ง
1
2
# ํน์ ์ปฌ๋ผ ๊ฐ์ด 100๋ณด๋ค ํฐ ํ๋ง ํํฐ๋ง
filtered_df = df[df['column_name'] > 100]
๐ ์ฌ๋ฌ ์กฐ๊ฑด์ ์กฐํฉํ ํํฐ๋ง
1
2
# ์ฌ๋ฌ ์กฐ๊ฑด์ ์กฐํฉํ ํํฐ๋ง
filtered_df = df[(df['column1'] > 100) & (df['column2'] == 'specific_value')]
-
๋ฐ์ดํฐ ํ์
๋ฐ์ดํฐ ํ์์ ๋ถ์ ์์ ์ ์ฒซ ๋จ๊ณ๋ก, ๋ฐ์ดํฐ์ ๊ตฌ์กฐ์ ์ฃผ์ ํน์ง์ ํ์ ํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
- Pandas์์๋ ๊ฐ๋จํ ๋ช ๋ น์ด๋ก ๋ฐ์ดํฐ์ ์์ฝ ์ ๋ณด, ๊ธฐ์ ํต๊ณ, ๊ฒฐ์ธก์น ๋ฑ์ ๋น ๋ฅด๊ฒ ํ์ธํ ์ ์์ต๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
# ์ฒ์ 5ํ ๋ณด๊ธฐ
df.head()
# ๊ธฐ๋ณธ ์ ๋ณด ๋ณด๊ธฐ
df.info()
# ๊ธฐ์ ํต๊ณ๋ ๋ณด๊ธฐ
df.describe()
# ๊ฒฐ์ธก์น ํ์ธ
df.isnull().sum()
-
๊ฒฐ์ธก์น ์ฒ๋ฆฌ
์ค์ ๋ฐ์ดํฐ์์ ๊ฒฐ์ธก์น๋ ๋งค์ฐ ํํ๊ฒ ๋ฐ์ํ๋ ๋ฌธ์ ์ ๋๋ค. Pandas๋ ๊ฒฐ์ธก์น๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๊ฒฐ์ธก์น๋ฅผ ์ ๊ฑฐํ๊ฑฐ๋, ํน์ ๊ฐ์ผ๋ก ๋์ฒดํ ์ ์์ต๋๋ค.
- ํด๋น ์น์
์์๋
dropna
,fillna
,bfill
,ffill
๋ฑ ๊ฒฐ์ธก์น ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ๋ค๋ฃจ๊ฒ ์ต๋๋ค.
๐ dropna()
๋ก ๊ฒฐ์ธก์น ์ ๊ฑฐ
-
dropna()
๋ ๊ฒฐ์ธก์น๊ฐ ํฌํจ๋ ํ ๋๋ ์ด์ ์ ๊ฑฐํฉ๋๋ค. ๊ฒฐ์ธก์น๊ฐ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ธํ๊ณ ๋ถ์์ ์งํํ ๋ ์ ์ฉํฉ๋๋ค.1 2 3 4 5
# ๊ฒฐ์ธก์น๊ฐ ํฌํจ๋ ํ์ ์ ๊ฑฐ df_cleaned = df.dropna() # ํน์ ์ปฌ๋ผ์์ ๊ฒฐ์ธก์น๊ฐ ํฌํจ๋ ํ๋ง ์ ๊ฑฐ df_cleaned = df.dropna(subset=['column_name'])
๐ fillna()
๋ก ๊ฒฐ์ธก์น ์ฑ์ฐ๊ธฐ
-
fillna()
๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ์ธก์น๋ฅผ ํน์ ๊ฐ์ผ๋ก ๋์ฒดํ ์ ์์ต๋๋ค. ํ๊ท ๊ฐ, ์ค๊ฐ๊ฐ ๋๋ ๊ณ ์ ๋ ๊ฐ์ ์ฌ์ฉํ์ฌ ๊ฒฐ์ธก์น๋ฅผ ์ฑ์ธ ์ ์์ต๋๋ค.1 2 3 4 5
# ๊ฒฐ์ธก์น๋ฅผ 0์ผ๋ก ๋์ฒด df_filled = df.fillna(0) # ํน์ ์ปฌ๋ผ์ ๊ฒฐ์ธก์น๋ฅผ ํ๊ท ๊ฐ์ผ๋ก ๋์ฒด df['column_name'] = df['column_name'].fillna(df['column_name'].mean())
๐ bfill()
๋ก ๊ฒฐ์ธก์น ๋ค์์ ์ฑ์ฐ๊ธฐ
-
bfill()
์ ๊ฒฐ์ธก์น๊ฐ ์๋ ์ ์ ๋ค์ ์๋ ๊ฐ์ผ๋ก ์ฑ์๋๋ค. ์๊ฐ ์์ ๋ฐ์ดํฐ์์ ๊ฒฐ์ธก์น๋ฅผ ๋ค์ ๊ฐ์ผ๋ก ์ฑ์ ์ฐ์์ฑ์ ์ ์งํ ๋ ์ ์ฉํฉ๋๋ค.1 2
# ๊ฒฐ์ธก์น๋ฅผ ๋ค์ ๊ฐ์ผ๋ก ์ฑ์ฐ๊ธฐ df_bfill = df.fillna(method='bfill')
๐ ffill()
๋ก ๊ฒฐ์ธก์น ์์์ ์ฑ์ฐ๊ธฐ
-
ffill()
์ ๊ฒฐ์ธก์น๊ฐ ์๋ ์ ์ ์์ ์๋ ๊ฐ์ผ๋ก ์ฑ์๋๋ค. ์ด๋ ์ฐ์์ ์ธ ๊ฐ์ด ํ์ํ ๋ฐ์ดํฐ์์ ๊ฒฐ์ธก์น๋ฅผ ์ฑ์ธ ๋ ์ ์ฉํฉ๋๋ค.1 2
# ๊ฒฐ์ธก์น๋ฅผ ์์ ๊ฐ์ผ๋ก ์ฑ์ฐ๊ธฐ df_ffill = df.fillna(method='ffill')
-
Lambda ํจ์๋ก ๋ฐ์ดํฐ ๋ณํ
Lambda ํจ์
์apply()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ณํํ ๋ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
๐ ์กฐ๊ฑด๋ถ ์์น ๋ณํ
-
ํน์ ๊ฐ ์ด์์ด๊ฑฐ๋ ์ดํ์ธ ๊ฒฝ์ฐ ๊ฐ์ ํน์ ์์๋ก ๋ณํํ๊ฑฐ๋, ํน์ ๋ฒ์์ ์ํ ๋ ๋ค๋ฅธ ๊ฐ์ ๋์ ํ ์ ์์ต๋๋ค.
1 2
# ๊ฐ์ด 0๋ณด๋ค ์์ผ๋ฉด 0์ผ๋ก ๋ณํ, ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ทธ๋๋ก ์ ์ง df['non_negative'] = df['value'].apply(lambda x: 0 if x < 0 else x)
๐ ์ฌ๋ฌ ์กฐ๊ฑด์ ์ฒ๋ฆฌํ๊ธฐ
-
์ฌ๋ฌ ์กฐ๊ฑด์ ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ,
elif
๋์else
๋ฅผ ์ค์ฒฉ์์ผ ์ฌ์ฉํ ์ ์์ต๋๋ค.1 2
# 100 ์ด์์ 'A', 50 ์ด์์ 'B', ๊ทธ ์ธ๋ 'C'๋ก ๋ถ๋ฅ df['grade'] = df['score'].apply(lambda x: 'A' if x >= 100 else ('B' if x >= 50 else 'C'))
๐ ๋์๋ฌธ์ ๋ณํ
-
๋ฌธ์์ด์ ๋๋ฌธ์๋ ์๋ฌธ์๋ก ๋ณํํ๋ ๋๋ค ํจ์ ์์์ ๋๋ค.
1 2
# ์ปฌ๋ผ์ ๋ชจ๋ ๊ฐ์ ๋๋ฌธ์๋ก ๋ณํ df['upper_case'] = df['text_column'].apply(lambda x: x.upper())
๐ ๋ฆฌ์คํธ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๊ธฐ
-
๋๋ค ํจ์๋ ๋ฆฌ์คํธ๋ ๋ฐฐ์ด ํํ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๋๋ ์ ์ฉํฉ๋๋ค.
1 2
# ๋ฆฌ์คํธ ๋ด ์์์ ๊ฐ์์ ๋ฐ๋ผ ๊ฐ ๋ณํ df['list_length'] = df['list_column'].apply(lambda x: len(x))
๐ ๋ฌธ์์ด ๊ธธ์ด์ ๋ฐ๋ผ ํํฐ๋ง
-
๋ฌธ์์ด์ ๊ธธ์ด์ ๋ฐ๋ผ ์กฐ๊ฑด์ ๊ฑธ์ด ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
1 2
# ๋ฌธ์์ด ๊ธธ์ด๊ฐ 5 ์ด์์ธ ๊ฒฝ์ฐ์๋ง ์ ์งํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด 'Short'๋ก ๋ณํ df['processed_text'] = df['text_column'].apply(lambda x: x if len(x) >= 5 else 'Short')
-
๊ทธ๋ฃนํ ๋ฐ ์ง๊ณ
- ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํ์ฌ ์ง๊ณํ ๋๋
groupby()
๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ค์ํ ํต๊ณ๋ฅผ ๋ผ ์ ์์ต๋๋ค.
1
2
3
4
5
# ์นดํ
๊ณ ๋ฆฌ๋ณ ํ๊ท ๊ฐ ๊ณ์ฐ
grouped_df = df.groupby('category_column')['numeric_column'].mean()
# ๋ค์ค ์ปฌ๋ผ ๊ทธ๋ฃนํ ํ ์ง๊ณ
grouped_df = df.groupby(['category1', 'category2'])['numeric_column'].agg(['mean', 'sum'])
-
๋ฐ์ดํฐ ํ์ ๋ณํ
๋ฐ์ดํฐ ๋ถ์์ ์ํด ์ปฌ๋ผ์ ๋ฐ์ดํฐ ํ์ ์ ๋ณํํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
๐ ๋ฌธ์์ด์ ๋ ์ง๋ก ๋ณํ
1
2
# ๋ฌธ์์ด์ ๋ ์ง ํ์
์ผ๋ก ๋ณํ
df['date_column'] = pd.to_datetime(df['date_column'])
๐ ์์นํ ๋ฐ์ดํฐ๋ฅผ ์นดํ ๊ณ ๋ฆฌํ์ผ๋ก ๋ณํ
1
2
# ์์นํ ๋ฐ์ดํฐ๋ฅผ ์นดํ
๊ณ ๋ฆฌํ์ผ๋ก ๋ณํ
df['category_column'] = df['category_column'].astype('category')
๋ง๋ฌด๋ฆฌ
Pandas์ ๋ค์ํ ๊ธฐ๋ฅ์ ํ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ค ์ฝ๊ฒ ์ ๋ ฌํ๊ณ ๋ถ์ํ ์ ์์ต๋๋ค. ์ด ๊ธ์์ ์๊ฐํ ์ค๋ํซ๋ค์ ์ค๋ฌด์์ ์์ฃผ ์ฌ์ฉ๋๋ ํ ํฌ๋๋ค๋ก, ํ์ํ ๋๋ง๋ค ๋น ๋ฅด๊ฒ ๋ณต์ฌํ์ฌ ์ฌ์ฉํ ์ ์๋๋ก ์ค๋น๋์์ต๋๋ค. Pandas์ ํ๋ถํ ๊ธฐ๋ฅ๋ค์ ์ตํ๋ฉด ๋ฐ์ดํฐ ์กฐ์๊ณผ ๋ถ์ ์์ ์์ ํฐ ํจ์จ์ฑ์ ์ป์ ์ ์์ ๊ฒ์ ๋๋ค.
๋ง์ง๋ง์ผ๋ก Pandas์์ ๊ณต์์ผ๋ก ์์ฑํ Cheating Sheet ๊ณต์ ๋๋ฆฌ๋ฉด์ ์ด๋ฒ ํฌ์คํธ ๋ง์ณ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค! (๋งํฌ: https://pandas.pydata.org/Pandas_Cheat_Sheet.pdf)
๋ ์ถ๊ฐํ ์ฝ๋ ๋ธ๋ก์ด ์๋ค๋ฉด ๋๊ธ๋ก ๋ฌ์์ฃผ์ธ์ ๐ค๐