์์ธํ ์ ๋ณด๋ ์๋ ์ฐธ๊ณ
https://pandas.pydata.org/docs/
pandas documentation — pandas 2.2.3 documentation
API reference The reference guide contains a detailed description of the pandas API. The reference describes how the methods work and which parameters can be used. It assumes that you have an understanding of the key concepts.
pandas.pydata.org
ํ๋ค์ค๋?
ํ๋ค์ค๋ ๋ฐ์ดํฐ ๋ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ์๋ฆฌ์ฆ์ ๋ฐ์ดํฐํ๋ ์ ์๋ฃํ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฌ๋ค.
๋ด๋ถ์ ์ผ๋ก ๋ํ์ด๋ฅผ ํ์ฉํ๋ฉฐ, Flask, Sklearn ๋ฑ ๋ค๋ฅธ ์์คํ ๊ณผ ์ฐ๊ฒฐ์ด ์ฉ์ดํ๋ค.
- Series: 1์ฐจ์ ๋ฐฐ์ด, ํ๋์ ์ด์ ํด๋น, ๊ฐ ์์๋ ์ธ๋ฑ์ค๋ก ์๋ณ
- DataFrame: 2์ฐจ์ ๋ฐฐ์ด, ์ฌ๋ฌ ๊ฐ์ ์๋ฆฌ์ฆ๊ฐ ๋ชจ์ธ ํํ, ํ๊ณผ ์ด๋ก ๊ตฌ์ฑ
๋ฐ์ดํฐํ๋ ์์ ์ธ๋ฑ์ค, ์ด, ๊ฐ์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
- ndarray[ํ][์ด]
- DataFrame[์ด][ํ]
import pandas as pd
data = {
'Class': ['Math', 'Science', 'History', 'Math', 'Science', 'History', 'Math'],
'Name': ['John', 'Alice', 'Bob', 'David', 'Eva', 'Frank', 'Grace'],
'Age': [18, 19, 20, 21, 22, 23, 24],
'Score': [85, 92, 76, 88, 90, 78, 90],
}
df = pd.DataFrame(data)
์ ๊ทผ ๋ฐ ์์
- ํน์ ์ด์ ์ ๊ทผํ๋ ค๋ฉด df['์ด ์ด๋ฆ'] ๋๋ df.์ด ์ด๋ฆ์ ์ฌ์ฉ
- ํ์ ์ธ๋ฑ์ค๋ก ์ ๊ทผ
# ์ด์ ์ ๊ทผ
print(df['Age'][0]) # ์ฒซ ๋ฒ์งธ ํ์ '๋์ด' ๊ฐ
# ์ด ์ด๋ฆ์ผ๋ก ์ ๊ทผ
print(df.Age)
# ์ด ์์
df['Age'] = df['Age'] + 1 # ๋์ด์ 1 ๋ํ๊ธฐ
DataFrame ์ ๋ณด ํ์ธ
- info(): ๋ฐ์ดํฐํ๋ ์์ ์ด๊ณผ ๋ฐ์ดํฐ ํ์ , ๊ฒฐ์ธก๊ฐ ๋ฑ์ ํ์ธ
- describe(): ๊ธฐ๋ณธ์ ์ธ ํต๊ณ๋ ํ์ธ, include='all'๋ก ๋ชจ๋ ๋ฐ์ดํฐ ํ์ ์ ๋ํด ํต๊ณ ํ์ธ
- head()์ tail(): ๋ฐ์ดํฐํ๋ ์์ ์๋ถ๋ถ๊ณผ ๋ท๋ถ๋ถ ํ์ธ
print(df.info())
print(df.describe(include='all'))
print(df.head(2))
print(df.tail(2))
์ด ์ถ๊ฐ ๋ฐ ์ญ์
- ์ด์ ์ถ๊ฐ ๋ฐ ์ญ์
- ์ด์ ์ญ์ ํ ๋๋ del์ด๋ drop() ์ฌ์ฉ
df['Location'] = ['์์ธ', '๋ถ์ฐ', '๋์ ', '๋๊ตฌ', '๋ถ์ฐ', '์ธ์ฐ', None] # ์ ์ด ์ถ๊ฐ
del df['Location'] # ์ด ์ญ์
df.drop('Age', axis=1) # 'Age' ์ด ์ญ์
del df['Score'][85] # dataframe์์๋ ํน์ ๊ฐ ์์ฒด์ ์ญ์ ๋ฅผ ํ์ฉํ์ง ์๋๋ค.
๋ธ๋ก๋์บ์คํ ๊ณผ ์กฐ๊ฑด ํํฐ๋ง
- ๋ธ๋ก๋์บ์คํ ์ผ๋ก ํ ๋ฒ์ ์ฌ๋ฌ ๊ฐ ์์
- ์กฐ๊ฑด์ ๋ง์กฑํ๋ ํ์ ๋ํด True/False ๊ฐ์ ๋ถ์ฌ
df['over25'] = df['Age'] >= 20 # ๋์ด๊ฐ 20 ์ด์์ธ ๊ฒฝ์ฐ True
๋ฐ์ดํฐํ๋ ์ ๊ฒฐํฉ
- pd.concat() ํจ์: concat() ํจ์๋ก ๋ฐ์ดํฐํ๋ ์์ ์ธ๋ก(axis=0)๋ ๊ฐ๋ก(axis=1)๋ก ๊ฒฐํฉํ ๋ ์ฌ์ฉ
- pd.merge() ํจ์: merge()๋ SQL์ JOIN์ฒ๋ผ ๋ ๋ฐ์ดํฐํ๋ ์์ ํน์ ์ด์ ๊ธฐ์ค์ผ๋ก ๊ฒฐํฉํ ๋ ์ฌ์ฉ
์๋ฅผ๋ค์ด merge()์ how='left' ์ด๋ผ๋ฉด
- how='left'๋ ์ผ์ชฝ ๋ฐ์ดํฐํ๋ ์์ ๊ธฐ์ค์ผ๋ก ๊ฒฐํฉํ๊ณ , ์ค๋ฅธ์ชฝ ๋ฐ์ดํฐํ๋ ์์์ ์ผ์นํ๋ ๊ฐ๋ง ๊ฒฐํฉํ๋ค.
- ์ผ์ชฝ ๋ฐ์ดํฐํ๋ ์์ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์ ์ง๋๋ฉฐ, ์ค๋ฅธ์ชฝ ๋ฐ์ดํฐํ๋ ์์์ ์ผ์นํ์ง ์๋ ๊ฐ์ NaN์ผ๋ก ์ฑ์์ง๋ค.
# ์ถ๊ฐ ๋ฐ์ดํฐํ๋ ์
data2 = {
'Class': ['Math', 'Science', 'History', 'Math', 'Science', 'History', 'Math'],
'Teacher': ['Mr. A', 'Mrs. B', 'Ms. C', 'Mr. D', 'Mrs. E', 'Ms. F', 'Mr. G'],
}
df2 = pd.DataFrame(data2)
# ์ธ๋ก๋ก ๊ฒฐํฉ
df_combined = pd.concat([df, df2], axis=0)
print("์ธ๋ก๋ก ๊ฒฐํฉ",df_combined)
# ๊ฐ๋ก๋ก ๊ฒฐํฉ
df_combined = pd.concat([df, df2], axis=1)
print("๊ฐ๋ก๋ก ๊ฒฐํฉ",df_combined)
# ์ธ๋ฑ์ค ๋ฆฌ์
df_combined = pd.concat([df, df2], ignore_index=True)
print("์ธ๋ฑ์ค ๋ฆฌ์
",df_combined)
# ๊ณตํต๋ ํ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด(๊ฐ๋ก ๋ฐฉํฅ)์ ๊ฒฐํฉ (inner join)
df_combined = pd.concat([df, df2], join='inner', axis=1)
print("๊ณตํต๋ ํ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด ๊ฒฐํฉ:", df_combined)
# merge()๋ฅผ ์ฌ์ฉํ์ฌ 'Class' ์ด์ ๊ธฐ์ค์ผ๋ก ๊ฒฐํฉ
df_combined = pd.merge(df, df2, on='Class', how='left')
print("merge() ์ฌ์ฉ (how='left'):")
print(df_combined)
NaN ์ฒ๋ฆฌ
- ํ๋ค์ค์์ None์ NaN์ผ๋ก ๋ฐ๋๋๋ค. ์ด๋ NumPy์์ ์ ๊ณตํ๋ ๊ฒฐ์ธก๊ฐ์ ์๋ฏธ
df['Score']['์
'] = None # '์
' ํ์ 'Score' ๊ฐ์ None ํ ๋น, NaN์ด ๋ฉ๋๋ค.
๋ฐ์ดํฐ ์ ๊ทผ ๋ฐ ์กฐ์
๋ฐ์ดํฐ๊ฐ ์๋์ ๊ฐ์ ๋
import pandas as pd
data = {
'Class': ['Math', 'Science', 'History', 'Math', 'Science', 'History', 'Math'],
'Name': ['John', 'Alice', 'Bob', 'David', 'Eva', 'Frank', 'Grace'],
'Age': [18, 19, 20, 21, 22, 23, 24],
'Score': [85, 92, 76, 88, 90, 78, 90],
}
์ฌ๋ผ์ด์ฑ
# ๋ณ์๋ช
.loc[ํ(์ธ๋ฑ์ค๋ช
), ์ด(์ปฌ๋ผ๋ช
)]
df.loc[1:, 'Age':'Score'] # 1๋ฒ ํ๋ถํฐ ์์ํ์ฌ 'Age'์์ 'Score'๊น์ง ์ฌ๋ผ์ด์ฑ
df.loc[[1, 2], ['Score', 'Age']] # 1๋ฒ, 2๋ฒ ํ์ 'Score'์ 'Age' ์ด๋ง ์ ํ
# ๋ณ์๋ช
.iloc[ํ์ธ๋ฑ์ค์์ฒด, ์ด์ธ๋ฑ์ค์์ฒด]
df.iloc[1:, 1:] # 1๋ฒ ํ๋ถํฐ ์์ํ์ฌ 1๋ฒ ์ด๋ถํฐ ๋๊น์ง ์ฌ๋ผ์ด์ฑ
์ธ๋ฑ์ฑ
df = pd.DataFrame(data)
# 1. loc[] ์ธ๋ฑ์ฑ (๋ผ๋ฒจ ๊ธฐ๋ฐ)
print(df.loc[1, 'Name']) # 1๋ฒ ํ์ 'Name' ์ด ๊ฐ
print(df.loc[3:5, ['Class', 'Score']]) # 3~5๋ฒ ํ์ 'Class'์ 'Score' ์ด ๊ฐ
# 2. iloc[] ์ธ๋ฑ์ฑ (์ ์ ๊ธฐ๋ฐ)
print(df.iloc[1, 0]) # 1๋ฒ ํ์ 0๋ฒ์งธ ์ด ๊ฐ
print(df.iloc[3:6, [1, 3]]) # 3~5๋ฒ ํ์ 1๋ฒ, 3๋ฒ ์ด ๊ฐ
# 3. ์ด(column) ์ธ๋ฑ์ฑ
print(df['Age']) # 'Age' ์ด ์ ์ฒด (Series ๋ฐํ)
print(df['Name'][2]) # 'Name' ์ด์ 2๋ฒ ํ ๊ฐ
# 4. ๋ฆฌ์คํธ๋ฅผ ํ์ฉํ ํ/์ด ์ธ๋ฑ์ฑ
print(df.loc[[0, 2, 4], ['Name', 'Score']]) # 0, 2, 4๋ฒ ํ์ 'Name'๊ณผ 'Score' ์ด ๊ฐ
print(df.iloc[[0, 2, 4], [1, -1]]) # 0, 2, 4๋ฒ ํ์ 1๋ฒ ์ด๊ณผ ๋ง์ง๋ง ์ด ๊ฐ
# 5. ๋ถ๋ฆฌ์ธ ์ธ๋ฑ์ฑ
print(df[df['Score'] > 80]) # 'Score'๊ฐ 80๋ณด๋ค ํฐ ํ ์ ํ
print(df.loc[df['Class'] == 'Math']) # 'Class'๊ฐ 'Math'์ธ ํ ์ ํ
๋ฐ์ดํฐ ์์
df.loc[2, 'Name'] = 'S3' # ๋ ๋ฒ์งธ ํ์ ์ด๋ฆ์ 'S3'๋ก ์์
๋ฐ์ดํฐํ๋ ์ ์ ๋ ฌ
Age ์ด์ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ
inplace=True๋ก ์ค์ ํ๋ฉด ์๋ณธ ๋ฐ์ดํฐํ๋ ์์ด ๋ณ๊ฒฝ๋๊ณ , sort_values() ํจ์์์ ์ธ๋ฑ์ค๋ฅผ ๋ฆฌ์ ํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์
์ธ๋ฑ์ค๋ฅผ ํน๋ณํ ์ง์ ํด์ฃผ์ง ์์ผ๋ฉด NumPy ๋ค์ฐจ์๋ฐฐ์ด์ฒ๋ผ 0๋ถํฐ ์ธ๋ฑ์ค๊ฐ ์์
- inplace=True: ์๋ณธ ๋ฐ์ดํฐํ๋ ์์ ์ ๋ ฌํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ง ์์
- ignore_index=True: ์ ๋ ฌ ํ ์๋ก์ด ์ธ๋ฑ์ค๋ฅผ 0๋ถํฐ ์์ํ๋๋ก ๋ฆฌ์
df.sort_values('Age', ascending=False, inplace=True, ignore_index=True)
df.sort_values(['Name', 'Score']) #Name๊ณผ Score ๋ ์ด์ ๊ธฐ์ค์ผ๋ก ์์ฐจ์ ์ผ๋ก ์ ๋ ฌํฉ๋๋ค.
๊ฐ ๋์ฒด
- Class ์ด์์ Math์ Mathematics์ผ๋ก, Sciecne์ Physics๋ก ๋์ฒด
df.Class.replace(['Math', 'Science'], ['Mathematics', 'Physics'], inplace=True)
# ๊ฐ ๋ฐ(Class)์ ์ฒซ ๋ฒ์งธ ์ฌ๋ ์ ๋ณด๋ง ์ถ๋ ฅ
df_first_in_class = df[~df.Class.duplicated()]
print("๊ฐ ๋ฐ(Class)์ ์ฒซ ๋ฒ์งธ ์ฌ๋ ์ ๋ณด:")
print(df_first_in_class)
print()
# ๋์ด๊ฐ 24 ์ด๊ณผ์ธ ์ฌ๋๋ง ์ถ๋ ฅ
df_over_24 = df[df['Age'] > 24]
print("๋์ด๊ฐ 24 ์ด๊ณผ์ธ ์ฌ๋๋ค:")
print(df_over_24)
print()
# C๋ฐ(Class == 'C')์์ ๋์ด๊ฐ 24 ์ด๊ณผ์ธ ์ฌ๋ ์ถ๋ ฅ
df_C_over_24 = df[(df['Age'] > 24) & (df['Class'] == 'C')]
print("C๋ฐ์์ ๋์ด๊ฐ 24 ์ด๊ณผ์ธ ์ฌ๋๋ค:")
print(df_C_over_24)
print()
# ์ํ ์ ์๊ฐ 80์ ์ด์ 90์ ๋ฏธ๋ง์ธ ์ฌ๋๋ค์ Name๊ณผ Score ์ถ๋ ฅ
df_80_to_90 = df.loc[(80 <= df['Score']) & (df['Score'] < 90), ['Name', 'Score']]
print("์ํ ์ ์๊ฐ 80์ ์ด์ 90์ ๋ฏธ๋ง์ธ ์ฌ๋๋ค:")
print(df_80_to_90)
print()
# np.where๋ฅผ ์ฌ์ฉํ์ฌ Pass ๋๋ Fail ๊ฐ ํ ๋น
df['Result'] = np.where(df['Score'] >= 80, 'Pass', 'Fail')
print("np.where ์ฌ์ฉํ์ฌ 'Pass' ๋๋ 'Fail' ๊ฐ ํ ๋น:")
print(df)
print()
# Pass๋ฅผ True๋ก, Fail์ False๋ก ๋ณํ
df['Result'].replace(['Pass', 'Fail'], [True, False], inplace=True)
print("Pass๋ฅผ True๋ก, Fail์ False๋ก ๋ณํ:")
print(df)
print()
# ๋ง์ง๋ง ํ์ ๋ง์ง๋ง ๊ฐ์ True๋ก ์์
df.iloc[-1, -1] = True
print("๋ง์ง๋ง ํ์ ๋ง์ง๋ง ๊ฐ์ True๋ก ์์ :")
print(df)
๊ณ ์ ๊ฐ ๋ฐ ๋น๋์ ํ์ธ
# ๊ณ ์ 'Class' ๊ฐ
print(df['Class'].unique()) # ๊ณ ์ 'Class' ๊ฐ
# 'Class'๋ณ ๋น๋์ ํ์ธ
print(df['Class'].value_counts()) # 'Class'๋ณ ๋น๋์
์ค๋ณต๊ฐ ํ์ธ
print(df['Date'].duplicated()) # 'Date' ์ด์์ ์ค๋ณต๋ ๊ฐ
๊ทธ๋ฃนํ ํ ์ง๊ณ์ฐ์ฐ
# 'Class' ๊ธฐ์ค์ผ๋ก ํ ๊ฐ์ ์ถ๋ ฅ
print(df.groupby('Class').count())
# 'Class' ๊ธฐ์ค์ผ๋ก 'Name'๊ณผ 'Score' ๊ฐ์ ์ถ๋ ฅ
print(df.groupby('Class')[['Name', 'Score']].count())
# 'Class' ๊ธฐ์ค์ผ๋ก ํฉ๊ณ ์ถ๋ ฅ
print(df.groupby('Class')[['Name', 'Score']].sum())
# 'Class' ๊ธฐ์ค์ผ๋ก ํ๊ท ์ ์ ์ถ๋ ฅ
print(df.groupby('Class')[['Score']].mean())
# 'Class' ๊ธฐ์ค์ผ๋ก ์ต์ ์ ์ ์ถ๋ ฅ
print(df.groupby('Class')[['Score']].min())
# 'Class' ๊ธฐ์ค์ผ๋ก ์ต๋ ์ ์ ์ถ๋ ฅ
print(df.groupby('Class')[['Score']].max())
ํน์ ๊ฐ ์ถ๋ ฅ
# 'Name'์ด 'David'์ธ ํ ์ถ๋ ฅ
df_name = df_avg_score_reset_2.loc[df_avg_score_reset_2['Name'] == 'David']
print(df_name)
๋ ์ง ํ์ ๋ณํ ๋ฐ ํํฐ๋ง
from datetime import datetime, timedelta
import pandas as pd
data = {
'Name': ['John', 'Alice', 'Bob', 'David', 'Eva'],
'Date': ['2022-03-10', '2022-03-12', '2022-03-15', '2022-03-17', '2022-03-20'],
'Score': [85, 92, 76, 88, 90]
}
df = pd.DataFrame(data)
# ๋ ์ง ํ์ ๋ณํ
df['Date'] = pd.to_datetime(df['Date'])
# ๋ฑ๋ก์ผ์๊ฐ '2022-03-15' ์ดํ์ธ ๋ฐ์ดํฐ ํํฐ๋ง
df_filtered = df[df['Date'] >= '2022-03-15']
print(df_filtered)
# ๋ ์ง์ 14์ผ ์ถ๊ฐ
df['Date'] = df['Date'] + timedelta(days=14)
print(df.head())
# '2022-03-15'์ธ ํ์์ 'Name' ์ด๋ง ์ถ๋ ฅ
df_names_2022_03_15 = df.loc[df['Date'] == '2022-03-15', 'Name']
print(df_names_2022_03_15)
Pivot, Melt
Melt (๊ธด ํ์์ผ๋ก ๋ณํ)
- ๋ฐ์ดํฐ๋ฅผ ๊ธด ํ์์ผ๋ก ๋ณํ
- 'Class', 'Score' ์ด -> 'Subject', 'Value'๋ก ๋ณํ
- id_vars: ๋ณํํ์ง ์๊ณ ์ ์งํ ์ด์ ์ง์
# 'Name'๊ณผ 'Age'๋ฅผ id๋ก ์ฌ์ฉํ๊ณ , 'Class'์ 'Score'๋ฅผ ๊ธด ํ์์ผ๋ก ๋ณํ
df_melted = df.melt(id_vars=['Name', 'Age'], var_name='Subject', value_name='Value')
print(df_melted)
# ์ถ๋ ฅ ๊ฒฐ๊ณผ
Name Age Subject Value
0 John 18 Class Math
1 Alice 19 Class Science
2 Bob 20 Class History
3 David 21 Class Math
4 Eva 22 Class Science
5 Frank 23 Class History
6 Grace 24 Class Math
7 John 18 Score 85
8 Alice 19 Score 92
9 Bob 20 Score 76
10 David 21 Score 88
11 Eva 22 Score 90
12 Frank 23 Score 78
13 Grace 24 Score 90
Pivot (๋์ ํ์์ผ๋ก ๋ณํ)
- ๊ธด ํ์์ ๋ฐ์ดํฐ๋ฅผ ๋์ ํ์์ผ๋ก ๋ณํ
- Name์ ์ธ๋ฑ์ค๋ก ์ฌ์ฉํ๊ณ , Subject๋ฅผ ์ด๋ก ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋์ ํ์์ผ๋ก ๋ณํ
- values: ํผ๋ฒ ํ ์ด๋ธ์์ ์ฑ์ธ ๊ฐ์ ์ง์ ํ๋ ์ด
# 'Name'์ index๋ก, 'Subject'๋ฅผ columns๋ก ํผ๋ฒ
df_pivoted = df.pivot(index='Name', columns='Subject', values='Value')
print(df_pivoted)
# ์ถ๋ ฅ
Subject Class Score
Name
Alice Science 92
Bob History 76
David Math 88
Eva Science 90
Frank History 78
Grace Math 90
John Math 85
# 'Name'์ index๋ก, 'Subject'๋ฅผ columns๋ก, 'Score' ๊ฐ์ ํผ๋ฒ
df_pivoted_values = df.pivot(index='Name', columns='Class', values='Score')
print(df_pivoted_values)
# ์ถ๋ ฅ
Class History Math Science
Name
Alice NaN NaN 92
Bob 76.0 NaN NaN
David NaN 88.0 NaN
Eva NaN NaN 90
Frank 78.0 NaN NaN
Grace NaN 90.0 NaN
John NaN 85.0 NaN
Google Drive์์ CSV ํ์ผ ์ฝ๊ธฐ (๋ค๋ฅธ ๋ฐ์ดํฐ์ ์ผ๋ก ๋ณ๊ฒฝ)
from google.colab import drive
# Google Drive ๋ง์ดํธ
drive.mount('/content/drive')
# ๋ฐ์ดํฐ ์ฝ๊ธฐ
df = pd.read_csv('/content/drive/MyDrive/data/your_data.csv')
# ๋ฐ์ดํฐ ์ ๋ณด ํ์ธ
df.info()
'๐ฐ์ฐ๋ฆฌ FISA > ๋น ๋ฐ์ดํฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Elastic Search (0) | 2025.02.15 |
---|---|
NumPy ์ ๋ฆฌ (0) | 2025.01.10 |
๋น ๋ฐ์ดํฐ ์ปค๋ฆฌ์ด ๊ฐ์ด๋๋ถ(2) (0) | 2024.12.24 |
๋น ๋ฐ์ดํฐ ์ปค๋ฆฌ์ด ๊ฐ์ด๋๋ถ(1) (2) | 2024.12.24 |