1๋ฐ์ดํฐ ๊ตฌ์กฐ ์์ฑ
# Series (1D)
s = pd.Series([3,-5,7],
index=['a','b','c'])
# DataFrame (2D)
data = {'์ด๋ฆ': ['๊น','์ด','๋ฐ'],
'๋์ด': [25,30,28],
'์ ์': [90,85,95]}
df = pd.DataFrame(data)
# ์ด๋ฆ ๋์ด ์ ์
# 0 ๊น 25 90
# 1 ์ด 30 85
# 2 ๋ฐ 28 95
2I/O (์ฝ๊ธฐ/์ฐ๊ธฐ)
# CSV
df = pd.read_csv('f.csv',
encoding='utf-8', header=0)
df.to_csv('out.csv', index=False)
# Excel
df = pd.read_excel('f.xlsx',
sheet_name='Sheet1')
df.to_excel('out.xlsx')
# JSON
df = pd.read_json('f.json')
# SQL
df = pd.read_sql(query, engine)
3๊ธฐ๋ณธ ์ ๋ณด ํ์ธ
| ๋ฉ์๋ | ์ค๋ช
|
| df.head(n) .tail(n) | ์ฒ์/๋ง์ง๋ง nํ |
| df.shape | (ํ์, ์ด์) |
| df.info() | ํ์
, ๋ ์์ฝ |
| df.describe() | ๊ธฐ์ ํต๊ณ |
| df.dtypes | ์ด๋ณ ๋ฐ์ดํฐํ์
|
| df.columns / .index | ์ด๋ช
/ ์ธ๋ฑ์ค |
| df.count() .nunique() | ๋น๊ฒฐ์ธก/๊ณ ์ ๊ฐ ์ |
| df['c'].value_counts() | ๊ฐ๋ณ ๋น๋ |
4์ ํ & ์ธ๋ฑ์ฑ
# ์ด ์ ํ
df['์ด๋ฆ'] # Series
df[['์ด๋ฆ','๋์ด']] # DataFrame
# loc: ๋ผ๋ฒจ ๊ธฐ๋ฐ
df.loc[0,'์ด๋ฆ']
df.loc[0:2,['์ด๋ฆ','์ ์']]
# iloc: ์์น(์ ์) ๊ธฐ๋ฐ
df.iloc[0,0]
df.iloc[0:2, 0:2]
# ๋ถ๋ฆฌ์ธ ์ธ๋ฑ์ฑ
df[df['๋์ด'] > 25]
df[(df['๋์ด']>25) & (df['์ ์']>85)]
df[df['์ด๋ฆ'].isin(['๊น','๋ฐ'])]
df.query('๋์ด>25 and ์ ์>85')
5๋ฐ์ดํฐ ์ ์ (๊ฒฐ์ธก/์ค๋ณต)
# ๊ฒฐ์ธก์น
df.isnull().sum() # ์ด๋ณ ๊ฒฐ์ธก
df.dropna() # ๊ฒฐ์ธก ํ ์ญ์
df.dropna(axis=1) # ๊ฒฐ์ธก ์ด ์ญ์
df.fillna(0) # 0์ผ๋ก ์ฑ์
df.fillna(method='ffill')# ์๊ฐ
df.fillna(df.mean()) # ํ๊ท
# ์ค๋ณต
df.duplicated()
df.drop_duplicates()
# ํ์
๋ณํ
df['๋์ด'].astype(int)
# ์ด๋ฆ ๋ณ๊ฒฝ / ๊ฐ ์นํ
df.rename(columns={'๋์ด':'age'})
df.replace({'๊น':'Kim'})
6์ด ์ถ๊ฐ/์ญ์ /๋ณํ
# ์ถ๊ฐ
df['๋ฑ๊ธ'] = ['A','B','A']
df['๋น์จ'] = df['์ ์']/df['๋์ด']
# ์ญ์
df.drop(columns=['๋ฑ๊ธ'])
df.drop([0,2]) # ํ ์ญ์
# apply (ํจ์ ์ ์ฉ)
df['์ ์'].apply(lambda x: x*1.1)
df.apply(lambda x: x.max()-x.min())
# map (Series ๋งคํ)
df['๋ฑ๊ธ'].map({'A':4,'B':3})
7์ ๋ ฌ & ํต๊ณ
# ์ ๋ ฌ
df.sort_values('๋์ด')
df.sort_values('์ ์',ascending=False)
df.sort_values(['๋ฑ๊ธ','์ ์'])
df.nlargest(3,'์ ์') # ์์3
| ํต๊ณ ๋ฉ์๋ | ์ค๋ช
|
| .sum() .mean() | ํฉ๊ณ / ํ๊ท |
| .median() .std() | ์ค์๊ฐ/ํ์คํธ์ฐจ |
| .min() .max() | ์ต์ / ์ต๋ |
| .cumsum() | ๋์ ํฉ |
| .corr() | ์๊ดํ๋ ฌ |
| .describe() | ๊ธฐ์ ํต๊ณ ์ ์ฒด |
| .rank() | ์์ |
8GroupBy (๊ทธ๋ฃน ์ฐ์ฐ)
g = df.groupby('๋ฑ๊ธ')
g.mean() # ๊ทธ๋ฃน๋ณ ํ๊ท
g.size() # ๊ทธ๋ฃน๋ณ ํฌ๊ธฐ
g.describe() # ๊ธฐ์ ํต๊ณ
# ๋ค์ค ํค
df.groupby(['๋ฑ๊ธ','์ฑ๋ณ']).mean()
# agg: ๋ค์ํ ์ง๊ณ
g.agg({'์ ์':['mean','max'],
'๋์ด':'min'})
# transform: ์๋ ํฌ๊ธฐ ์ ์ง
g['์ ์'].transform(
lambda x:(x-x.mean())/x.std())
# filter: ์กฐ๊ฑด ๊ทธ๋ฃน๋ง
g.filter(lambda x: x['์ ์'].mean()>85)
9๋ณํฉ & ๊ฒฐํฉ
# merge (SQL JOIN)
pd.merge(df1, df2, on='key')
pd.merge(df1, df2,
left_on='a', right_on='b',
how='left')
# how: inner outer left right
# concat (๋จ์ ๊ฒฐํฉ)
pd.concat([df1, df2]) # ์ธ๋ก
pd.concat([df1,df2],axis=1)# ๊ฐ๋ก
# join (์ธ๋ฑ์ค ๊ธฐ๋ฐ)
df1.join(df2, how='outer')
10ํผ๋ฒ & ๋ฆฌ์
ฐ์ดํ
# pivot_table
pd.pivot_table(df,
values='์ ์', index='๋ฑ๊ธ',
columns='์ฑ๋ณ', aggfunc='mean')
# melt (wide โ long)
pd.melt(df, id_vars=['์ด๋ฆ'],
value_vars=['๊ตญ์ด','์์ด'])
# stack/unstack
df.stack() # ์ดโํ
df.unstack() # ํโ์ด
# ๋๋ฏธ๋ณ์
pd.get_dummies(df['๋ฑ๊ธ'])
11๋ฌธ์์ด (.str ์ ๊ทผ์)
df['์ด๋ฆ'].str.upper()
df['์ด๋ฆ'].str.contains('๊น')
df['์ด๋ฆ'].str.replace('๊น','Kim')
df['์ด๋ฆ'].str.split(' ')
df['์ด๋ฆ'].str.len()
df['์ด๋ฆ'].str.strip()
df['์ด๋ฆ'].str.lower()
df['์ด๋ฆ'].str.startswith('๊น')
12๋ ์ง/์๊ฐ (.dt ์ ๊ทผ์)
df['๋ ์ง'] = pd.to_datetime(df['๋ ์ง'])
df['๋
'] = df['๋ ์ง'].dt.year
df['์'] = df['๋ ์ง'].dt.month
df['์์ผ'] = df['๋ ์ง'].dt.day_name()
# ๋ ์ง ๋ฒ์
pd.date_range('2026-01-01',
periods=30, freq='D')
# ๋ฆฌ์ํ๋ง
df.resample('M').mean() # ์๋ณ
df.resample('W').sum() # ์ฃผ๋ณ