KR_Pandas - somaz94/python-study GitHub Wiki
Pandas๋ ๋ฐ์ดํฐ ๋ถ์๊ณผ ์กฐ์์ ์ํ ํ์ด์ฌ์ ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ํจ์จ์ ์ธ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# DataFrame ์์ฑ
df = pd.DataFrame({
'A': [1, 2, 3, 4, 5],
'B': ['a', 'b', 'c', 'd', 'e'],
'C': [1.1, 2.2, 3.3, 4.4, 5.5],
'D': [True, False, True, True, False]
})
print("DataFrame ์์:")
print(df)
# Series ์์ฑ
s = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e'])
print("\nSeries ์์:")
print(s)
# ๋ค์ํ ๋ฐ์ดํฐ์์ DataFrame ์์ฑ
# 1. ๋์
๋๋ฆฌ ๋ฆฌ์คํธ์์ ์์ฑ
dict_list = [
{'name': 'John', 'age': 30, 'city': 'New York'},
{'name': 'Mike', 'age': 25, 'city': 'London'},
{'name': 'Sarah', 'age': 35, 'city': 'Tokyo'}
]
df_dict = pd.DataFrame(dict_list)
print("\n๋์
๋๋ฆฌ ๋ฆฌ์คํธ๋ก ์์ฑํ DataFrame:")
print(df_dict)
# 2. NumPy ๋ฐฐ์ด์์ ์์ฑ
array = np.random.rand(3, 4)
df_array = pd.DataFrame(array, columns=['W', 'X', 'Y', 'Z'])
print("\nNumPy ๋ฐฐ์ด๋ก ์์ฑํ DataFrame:")
print(df_array)
# 3. ๋ ์ง ๋ฒ์ ์์ฑ
date_range = pd.date_range(start='2023-01-01', periods=5, freq='D')
df_dates = pd.DataFrame({'Date': date_range, 'Value': range(5)})
print("\n๋ ์ง ๋ฒ์๊ฐ ์๋ DataFrame:")
print(df_dates)
# DataFrame/Series ์ ๋ณด ํ์ธ
print("\nDataFrame ๊ธฐ๋ณธ ์ ๋ณด:")
print(f"Shape: {df.shape}")
print(f"Columns: {df.columns.tolist()}")
print(f"Index: {df.index.tolist()}")
print(f"Data Types:\n{df.dtypes}")
print(f"Memory Usage: {df.memory_usage(deep=True).sum()} bytes")
# ๊ธฐ๋ณธ์ ์ธ ๋ฉ์๋
print("\nDataFrame์ ์ฒ์ 2ํ:")
print(df.head(2))
print("\nDataFrame์ ๋ง์ง๋ง 2ํ:")
print(df.tail(2))
print("\nDataFrame์ ๊ธฐ์ ํต๊ณ:")
print(df.describe())
# CSV ํ์ผ ์ฝ๊ธฐ/์ฐ๊ธฐ
df.to_csv('data.csv', index=False)
df_read = pd.read_csv('data.csv')
print("\nCSV์์ ์ฝ์ DataFrame:")
print(df_read)
# Excel ํ์ผ ์ฝ๊ธฐ/์ฐ๊ธฐ
df.to_excel('data.xlsx', sheet_name='Sheet1', index=False)
df_excel = pd.read_excel('data.xlsx')
print("\nExcel์์ ์ฝ์ DataFrame:")
print(df_excel)
# JSON ํ์ ๋ณํ
json_str = df.to_json(orient='records')
print("\nJSON ๋ฌธ์์ด:")
print(json_str)
df_json = pd.read_json(json_str, orient='records')
print("\nJSON์์ ์ฝ์ DataFrame:")
print(df_json)
โ
ํน์ง:
- DataFrame ์์ฑ
- Series ์์ฑ
- ํ์ผ ์ ์ถ๋ ฅ
- ๋ค์ํ ๋ฐ์ดํฐ ์์ค ์ง์
- ํจ์จ์ ์ธ ๋ฐ์ดํฐ ๊ตฌ์กฐ
- ๊ฐํธํ ๋ฐ์ดํฐ ์กฐ์
- ๋น ๋ฅธ ๋ฐ์ดํฐ ๋ถ์
Pandas์ ๋ ๊ฐ์ง ํต์ฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ ๋น๊ต์ด๋ค.
ํน์ฑ | DataFrame | Series |
---|---|---|
์ฐจ์ | 2์ฐจ์ (ํ/ํ๋ ฌ) | 1์ฐจ์ (๋ฒกํฐ) |
๋ฐ์ดํฐ ํ์ | ๊ฐ ์ด๋ง๋ค ๋ค๋ฅธ ํ์ ๊ฐ๋ฅ | ๋จ์ผ ํ์ |
์ธ๋ฑ์ฑ | ํ/์ด ์ธ๋ฑ์ค | ๋จ์ผ ์ธ๋ฑ์ค |
์ฌ์ฉ ์ฌ๋ก | ๋ณต์กํ ๋ฐ์ดํฐ ๋ถ์ | ๋จ์ผ ๋ณ์ ๋ฐ์ดํฐ |
์์ฑ ๋ฐฉ๋ฒ | ๋์ ๋๋ฆฌ, ๋ฆฌ์คํธ, ๋ฐฐ์ด ๋ฑ | ๋ฆฌ์คํธ, ๋์ ๋๋ฆฌ, ์ค์นผ๋ผ ๋ฑ |
์ ์ฌ์ฑ | ์์ ์ํธ, SQL ํ ์ด๋ธ | ์์ ์ด, ๋์ ๋๋ฆฌ |
๊ณตํต์ | ์ธ๋ฑ์ฑ, ๋ฉ์๋, ์์ฑ ๋ง์ด ๊ณต์ | DataFrame์ ์ด์ Series |
Pandas๋ ๋ฐ์ดํฐ ์กฐ์์ ์ํ ๋ค์ํ ๋ฉ์๋์ ํจ์๋ฅผ ์ ๊ณตํ์ฌ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ๊ฐ๊ณต์ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
import pandas as pd
import numpy as np
# ์ํ ๋ฐ์ดํฐํ๋ ์ ์์ฑ
df = pd.DataFrame({
'A': [1, 2, 3, 4, 5],
'B': ['a', 'b', 'c', 'd', 'e'],
'C': [1.1, 2.2, np.nan, 4.4, 5.5],
'D': [True, False, True, True, False],
'E': pd.date_range(start='2023-01-01', periods=5)
})
print("์๋ณธ DataFrame:")
print(df)
# ๋ฐ์ดํฐ ์ ํ (์ด ๊ธฐ์ค)
print("\n๋จ์ผ ์ด ์ ํ:")
print(df['A']) # ๋จ์ผ ์ด ์ ํ (Series ๋ฐํ)
print("\n๋ณต์ ์ด ์ ํ:")
print(df[['A', 'B']]) # ๋ณต์ ์ด ์ ํ (DataFrame ๋ฐํ)
# ๋ฐ์ดํฐ ์ ํ (ํ ๊ธฐ์ค)
print("\nloc๋ฅผ ์ฌ์ฉํ ํ ์ ํ (๋ ์ด๋ธ ๊ธฐ๋ฐ):")
print(df.loc[0]) # ๋จ์ผ ํ ์ ํ
print("\nloc๋ฅผ ์ฌ์ฉํ ํ๊ณผ ์ด ์ ํ:")
print(df.loc[0:2, ['A', 'C']]) # ํน์ ํ๊ณผ ์ด ์ ํ
print("\niloc๋ฅผ ์ฌ์ฉํ ํ ์ ํ (์์น ๊ธฐ๋ฐ):")
print(df.iloc[0:2]) # ์ฒ์ 2๊ฐ ํ ์ ํ
print("\niloc๋ฅผ ์ฌ์ฉํ ํ๊ณผ ์ด ์ ํ:")
print(df.iloc[0:2, [0, 2]]) # ์ฒ์ 2๊ฐ ํ์ ์ฒซ ๋ฒ์งธ, ์ธ ๋ฒ์งธ ์ด
# ๋ถ๋ฆฌ์ธ ์ธ๋ฑ์ฑ์ ํตํ ๋ฐ์ดํฐ ํํฐ๋ง
print("\n์กฐ๊ฑด์ ๋ฐ๋ฅธ ํํฐ๋ง:")
filtered = df[df['A'] > 3] # A ์ด ๊ฐ์ด 3๋ณด๋ค ํฐ ํ
print(filtered)
print("\n๋ณตํฉ ์กฐ๊ฑด ํํฐ๋ง:")
complex_filter = df[(df['A'] > 2) & (df['C'] < 5.0)]
print(complex_filter)
# ๋ฐ์ดํฐ ์ ๋ ฌ
print("\n'A' ์ด ๊ธฐ์ค ์ค๋ฆ์ฐจ์ ์ ๋ ฌ:")
print(df.sort_values(by='A'))
print("\n'A' ์ด ๊ธฐ์ค ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ:")
print(df.sort_values(by='A', ascending=False))
print("\n์ฌ๋ฌ ์ด ๊ธฐ์ค ์ ๋ ฌ:")
print(df.sort_values(by=['D', 'A'], ascending=[False, True]))
# ์๋ก์ด ์ด ์ถ๊ฐ
df['F'] = df['A'] * 2
print("\n์ ์ด 'F' ์ถ๊ฐ (A*2):")
print(df)
# apply ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ํจ์ ์ ์ฉ
df['G'] = df['A'].apply(lambda x: x**2)
print("\napply๋ก ์ ์ด 'G' ์ถ๊ฐ (A^2):")
print(df)
# ์กฐ๊ฑด๋ถ ์ด ์์ฑ
df['H'] = np.where(df['A'] > 3, 'High', 'Low')
print("\n์กฐ๊ฑด๋ถ ์ด 'H' ์ถ๊ฐ:")
print(df)
# ๊ฒฐ์ธก์น ์ฒ๋ฆฌ
print("\n๊ฒฐ์ธก์น ํ์ธ:")
print(df.isna().sum())
print("\n๊ฒฐ์ธก์น๋ฅผ 0์ผ๋ก ์ฑ์ฐ๊ธฐ:")
print(df.fillna(0))
print("\n๊ฒฐ์ธก์น ์์ ๊ฐ์ผ๋ก ์ฑ์ฐ๊ธฐ:")
print(df.fillna(method='ffill'))
print("\n๊ฒฐ์ธก์น ๋ค์ ๊ฐ์ผ๋ก ์ฑ์ฐ๊ธฐ:")
print(df.fillna(method='bfill'))
print("\n๊ฒฐ์ธก์น๊ฐ ์๋ ํ ์ ๊ฑฐ:")
print(df.dropna())
print("\nํน์ ์ด์ ๊ฒฐ์ธก์น๋ง ์ฒ๋ฆฌ:")
df_copy = df.copy()
df_copy['C'] = df_copy['C'].fillna(df_copy['C'].mean())
print(df_copy)
# ๋ฐ์ดํฐ ๋ณํ
print("\n์ด A์ ํ์คํ:")
df['A_scaled'] = (df['A'] - df['A'].mean()) / df['A'].std()
print(df[['A', 'A_scaled']])
print("\n'A' ์ด์ ์์:")
df['A_rank'] = df['A'].rank()
print(df[['A', 'A_rank']])
# ํ/์ด ์ญ์
df_drop = df.copy()
print("\nํ ์ญ์ :")
print(df_drop.drop([0, 1], axis=0))
print("\n์ด ์ญ์ :")
print(df_drop.drop(['F', 'G'], axis=1))
โ
ํน์ง:
- ๋ฐ์ดํฐ ์ ํ
- ์กฐ๊ฑด๋ถ ํํฐ๋ง
- ์ด ์กฐ์
- ๊ฒฐ์ธก์น ์ฒ๋ฆฌ
- ๋ฐ์ดํฐ ์ ๋ ฌ
- ํจ์ ์ ์ฉ
- ๋ฐ์ดํฐ ๋ณํ
- ํ/์ด ๊ด๋ฆฌ
๋ฐ์ดํฐ ๋ถ์ ์ ์์ฃผ ๋ง์ฃผ์น๋ ๊ฒฐ์ธก์น ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ด๋ค.
์ฒ๋ฆฌ ๋ฐฉ๋ฒ | ์ฅ์ | ๋จ์ | ์ ํฉํ ์ํฉ |
---|---|---|---|
์ ๊ฑฐ (dropna) | ๊ฐ๋จํ๊ณ ๋น ๋ฆ | ๋ฐ์ดํฐ ์์ค | ๊ฒฐ์ธก์น๊ฐ ์ ์ ๋ |
์ฑ์ฐ๊ธฐ (fillna) | ๋ฐ์ดํฐ ์์ค ์์ | ๋ฐ์ดํฐ ์๊ณก ๊ฐ๋ฅ์ฑ | ์ ์ ํ ๋์ฒด๊ฐ ์กด์ฌ ์ |
ํต๊ณ๊ฐ ๋์ฒด | ๋ถํฌ ๋ณด์กด | ๋ณ๋์ฑ ๊ฐ์ | ์์นํ ๋ฐ์ดํฐ |
๋ณด๊ฐ (interpolate) | ํจํด ์ ์ง | ๊ณ์ฐ ๋ณต์ก์ฑ | ์๊ณ์ด ๋ฐ์ดํฐ |
์์ธก ๋ชจ๋ธ ์ฌ์ฉ | ์ ํ๋ ๋์ | ๊ตฌํ ๋ณต์ก | ์ถฉ๋ถํ ๋ฐ์ดํฐ ์กด์ฌ ์ |
๋ค์ค๋์ฒด | ๋ถํ์ค์ฑ ๋ฐ์ | ๊ณ์ฐ ๋น์ฉ | ์ ๋ฐํ ๋ถ์ ํ์ ์ |
Pandas๋ ๊ฐ๋ ฅํ ๋ฐ์ดํฐ ๋ถ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ๋ณต์กํ ๋ฐ์ดํฐ์์๋ ํต์ฐฐ๋ ฅ์ ์ป์ ์ ์๋ค.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# ์ํ ๋ฐ์ดํฐ ์์ฑ
np.random.seed(42)
data = {
'group': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'C'],
'value1': np.random.randint(0, 100, 10),
'value2': np.random.normal(50, 15, 10),
'category': np.random.choice(['X', 'Y', 'Z'], 10),
'date': pd.date_range(start='2023-01-01', periods=10)
}
df = pd.DataFrame(data)
print("์ํ ๋ฐ์ดํฐ:")
print(df)
# ๊ธฐ๋ณธ ํต๊ณ ๋ถ์
print("\n๊ธฐ๋ณธ ํต๊ณ ์์ฝ:")
print(df.describe())
print("\n์์นํ ์ด์ ํ๊ท :")
print(df[['value1', 'value2']].mean())
print("\n์์นํ ์ด์ ์ค์๊ฐ:")
print(df[['value1', 'value2']].median())
print("\n์์นํ ์ด์ ํ์คํธ์ฐจ:")
print(df[['value1', 'value2']].std())
print("\n์๊ด๊ด๊ณ ๋ถ์:")
print(df[['value1', 'value2']].corr())
# ๊ทธ๋ฃนํ ์ฐ์ฐ
print("\n๊ทธ๋ฃน๋ณ ํต๊ณ:")
grouped = df.groupby('group')
print(grouped[['value1', 'value2']].mean())
print("\n๊ทธ๋ฃน๋ณ ํฌ๊ธฐ:")
print(grouped.size())
print("\n๊ทธ๋ฃน๋ณ ๋ค์ํ ํต๊ณ:")
print(grouped.agg({
'value1': ['mean', 'median', 'std'],
'value2': ['min', 'max', 'count']
}))
# ๋ณตํฉ ๊ทธ๋ฃนํ
print("\n๋ณตํฉ ๊ทธ๋ฃนํ (group + category):")
complex_group = df.groupby(['group', 'category'])
print(complex_group['value1'].mean())
# ๋ณํ ํจ์ ์ ์ฉ
print("\n๊ทธ๋ฃน๋ณ Z-์ ์ ๊ณ์ฐ:")
def zscore(x):
return (x - x.mean()) / x.std()
transformed = grouped.transform(zscore)
print(transformed.head())
# ํผ๋ฒ ํ
์ด๋ธ
print("\nํผ๋ฒ ํ
์ด๋ธ (group vs category, value1 ํ๊ท ):")
pivot = df.pivot_table(
values='value1',
index='group',
columns='category',
aggfunc='mean',
fill_value=0
)
print(pivot)
print("\n๋ค์ค ๊ฐ ํผ๋ฒ ํ
์ด๋ธ:")
multi_pivot = df.pivot_table(
values=['value1', 'value2'],
index='group',
columns='category',
aggfunc=['mean', 'std']
)
print(multi_pivot)
# ์๊ณ์ด ๋ถ์
df['month'] = df['date'].dt.month
df['day'] = df['date'].dt.day
df['dayofweek'] = df['date'].dt.dayofweek
print("\n๋ ์ง ์ปดํฌ๋ํธ ์ถ์ถ:")
print(df[['date', 'month', 'day', 'dayofweek']].head())
# ๋์ ํต๊ณ
print("\n๋์ ํฉ๊ณ:")
print(df.groupby('group')['value1'].cumsum())
print("\n๋์ ์ต๋๊ฐ:")
print(df.groupby('group')['value1'].cummax())
# ์๊ฐํ (๊ธฐ๋ณธ)
plt.figure(figsize=(10, 6))
df.groupby('group')['value1'].mean().plot(kind='bar')
plt.title('Group Means')
plt.ylabel('Mean Value')
plt.tight_layout()
plt.savefig('group_means.png')
print("\n'group_means.png' ํ์ผ์ ์ฐจํธ๊ฐ ์ ์ฅ๋์์ต๋๋ค.")
# ๋ฒ์ฃผํ ๋ณ์ ๋ถ์
print("\n๋ฒ์ฃผํ ๋ณ์ ๋ถํฌ:")
print(df['category'].value_counts())
print("\n๊ต์ฐจํ (๊ทธ๋ฃน vs ์นดํ
๊ณ ๋ฆฌ):")
cross_tab = pd.crosstab(df['group'], df['category'])
print(cross_tab)
print("\n์ ๊ทํ๋ ๊ต์ฐจํ (ํ ๋น์จ):")
print(pd.crosstab(df['group'], df['category'], normalize='index'))
# ์ด์์น ํ์ง
Q1 = df['value1'].quantile(0.25)
Q3 = df['value1'].quantile(0.75)
IQR = Q3 - Q1
outliers = df[(df['value1'] < (Q1 - 1.5 * IQR)) | (df['value1'] > (Q3 + 1.5 * IQR))]
print("\n์ด์์น ๊ฐ์ง (IQR ๋ฐฉ๋ฒ):")
print(f"Q1: {Q1}, Q3: {Q3}, IQR: {IQR}")
print(f"ํํ ๊ฒฝ๊ณ: {Q1 - 1.5 * IQR}, ์ํ ๊ฒฝ๊ณ: {Q3 + 1.5 * IQR}")
print(outliers)
โ
ํน์ง:
- ๊ธฐ์ ํต๊ณ
- ๊ทธ๋ฃน ์ฐ์ฐ
- ํผ๋ฒ ํ ์ด๋ธ
- ์๊ณ์ด ๋ถ์
- ๋์ ํต๊ณ
- ๋ฒ์ฃผํ ๋ณ์ ๋ถ์
- ์ด์์น ํ์ง
- ์๊ฐํ ๊ธฐ์ด
Pandas์์ ์ ๊ณตํ๋ ๋ค์ํ ๊ทธ๋ฃนํ ์ฐ์ฐ ๋ฉ์๋์ด๋ค.
๋ฉ์๋ | ๋ฐํ ํ์ | ๊ธฐ๋ฅ | ์ฌ์ฉ ์์ |
---|---|---|---|
groupby.mean() | DataFrame/Series | ๊ทธ๋ฃน๋ณ ํ๊ท ๊ณ์ฐ | df.groupby('group')['value'].mean() |
groupby.agg() | DataFrame | ๋ค์ํ ์ง๊ณ ํจ์ ์ ์ฉ | df.groupby('group').agg({'value': ['mean', 'std']}) |
groupby.transform() | DataFrame | ์๋ณธ๊ณผ ๊ฐ์ ํฌ๊ธฐ๋ก ๋ณํ | df.groupby('group').transform(lambda x: x - x.mean()) |
groupby.filter() | DataFrame | ์กฐ๊ฑด์ ๋ง๋ ๊ทธ๋ฃน๋ง ํํฐ๋ง | df.groupby('group').filter(lambda x: x['value'].mean() > 50) |
groupby.apply() | DataFrame/Series | ์์ ํจ์ ์ ์ฉ | df.groupby('group').apply(lambda x: x.iloc[0]) |
pivot_table() | DataFrame | ๋ค์ฐจ์ ๊ทธ๋ฃนํ ๋ฐ ์ง๊ณ | df.pivot_table(values='value', index='group', columns='category') |
crosstab() | DataFrame | ๋ฒ์ฃผํ ๋ณ์ ๊ต์ฐจํ | pd.crosstab(df['group'], df['category']) |