ํ์ค์ ๋ฐ์ดํฐ๋ ํ ํ์ผ์ ๋ชจ๋ ๋ค์ด ์์ง ์๋ค.
๊ณ ๊ฐ ์ ๋ณด, ๊ฑฐ๋ ๋ด์ญ, ์ค๋ฌธ ์๋ต ๋ฑ์ด ์๋ก ๋ค๋ฅธ DataFrame์ผ๋ก ์กด์ฌํ๋ค.
์ด๋ค์ ํจ์จ์ ์ผ๋ก ํฉ์น๋ ๋ฐฉ๋ฒ์ด ๋ฐ๋ก ๊ฒฐํฉ(Concatenate), ๋ณํฉ(Merge), ์ฐ๊ฒฐ(Join)์ด๋ค.
| ๊ตฌ๋ถ | ๋ชฉ์ | ๊ธฐ์ค ์ด ํ์ ์ฌ๋ถ | ๋ํ ํจ์ |
|---|---|---|---|
| concat() | ์์๋ ๋๋ ์ข์ฐ๋ก ๋จ์ ์ฐ๊ฒฐ | ํ์ ์์ | pd.concat() |
| append() | concat์ ๊ฐ๊ฒฐํ ํํ (deprecated ์์ ) | ํ์ ์์ | df1.append(df2) |
| merge() | SQL์ JOIN์ฒ๋ผ ๊ณตํต ์ด ๊ธฐ์ค ๋ณํฉ | ํ์ ์์ | pd.merge() |
| join() | ์ธ๋ฑ์ค ๊ธฐ์ค ๋ณํฉ | ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ๋ฑ์ค ๊ธฐ์ค | df1.join(df2) |
pd.concat() โ ๋ฐ์ดํฐํ๋ ์ ์ด์ด ๋ถ์ด๊ธฐ๋ DataFrame์ ํ๋๋ก ํฉ์ณ ํ(row)์ ๋๋ฆฌ๋ ๋ฐฉ์.
๋จ์ํ ์์ง ๊ฒฐํฉ์ผ๋ก, ๊ณตํต ์ด ๊ตฌ์กฐ๋ง ๋ง์ผ๋ฉด ๋๋ค.
import pandas as pd
bank1_df = pd.DataFrame({
'Bank Client ID': [1, 2, 3, 4, 5],
'First Name': ['Nancy', 'Alex', 'Shep', 'Max', 'Allen'],
'Last Name': ['Rob', 'Ali', 'George', 'Mitch', 'Steve']
})
bank2_df = pd.DataFrame({
'Bank Client ID': [6, 7, 8, 9, 10],
'First Name': ['Bill', 'Dina', 'Sarah', 'Heather', 'Holly'],
'Last Name': ['Christian', 'Moe', 'Steve', 'Rob', 'Bob']
})
bank_all_df = pd.concat([bank1_df, bank2_df])
ignore_index=True๋ฅผ ์ฃผ๋ฉด ์๋์ผ๋ก ์ฌ์ ๋ ฌ๋๋ค.bank_all_df = pd.concat([bank1_df, bank2_df], ignore_index=True)
โก ๊ฒฐ๊ณผ:
0~9๊น์ง ์๋ก์ด ์ธ๋ฑ์ค๊ฐ ์๋ ์์ฑ๋๋ค.
append() vs concat()๊ณผ๊ฑฐ์ append()๋ ์ฌ์ฉํ๋ค:
bank_all_df = bank1_df.append(bank2_df, ignore_index=True)
ํ์ง๋ง Pandas 2.0 ์ดํ ๋น๊ถ์ฅ(deprecated) ๋์๊ธฐ ๋๋ฌธ์
ํญ์ pd.concat()์ ์ฌ์ฉํ ๊ฒ์ ๊ถ์ฅํ๋ค.
keys ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ์ธ๋ฑ์ค๊ฐ ์ถ๊ฐ๋๋ค.
bank_all_df = pd.concat(
[bank1_df, bank2_df],
keys=['Customer Group 1', 'Customer Group 2']
)
๊ฒฐ๊ณผ๋ ๋ฉํฐ ์ธ๋ฑ์ค(MultiIndex) ํํ๊ฐ ๋๋ค.
| (Customer Group, Index) | ... |
|---|---|
| (Customer Group 1, 0) | ... |
| (Customer Group 1, 1) | ... |
| (Customer Group 2, 0) | ... |
๋ฉํฐ ์ธ๋ฑ์ค ๋ฐ์ดํฐ๋ ๊ณ์ธต์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
bank_all_df.loc['Customer Group 1'] # ํน์ ๊ทธ๋ฃน ์ ์ฒด
bank_all_df.loc[('Customer Group 2', 3)] # ํน์ ๊ทธ๋ฃน์ ํ
โก ํ์ฉ ์์:
pd.merge() โ ๊ณตํต ์ด ๊ธฐ์ค ๋ณํฉpd.merge(left, right, on='๊ณตํต์ด', how='inner')
'inner': ๊ณตํต ํค๋ง (๊ต์งํฉ)'outer': ๋ชจ๋ ํค ํฌํจ (ํฉ์งํฉ)'left': ์ผ์ชฝ ๊ธฐ์ค ์ ์ง'right': ์ค๋ฅธ์ชฝ ๊ธฐ์ค ์ ์ง๊ธฐ์กด ๊ณ ๊ฐ ๋ฐ์ดํฐ + ์ฐ๋ด ๋ฐ์ดํฐ ๋ณํฉ
bank_all_df = pd.concat([bank1_df, bank2_df], ignore_index=True)
bank_salary_df = pd.DataFrame({
'Bank Client ID': [1,2,3,4,5,6,7,8,9,10],
'Annual Salary [$]': [2983, 4176, 5369, 5726, 4900, 3200, 3300, 3400, 2744, 2625]
})
merged_df = pd.merge(bank_all_df, bank_salary_df, on='Bank Client ID')
๊ฒฐ๊ณผ:
ํ๋์ DataFrame์ ๊ณ ๊ฐ ID, ์ด๋ฆ, ์ฑ, ์ฐ๋ด์ด ๋ชจ๋ ํฌํจ๋๋ค.
| ์ ํ | ์ฝ๋ | ์ค๋ช |
|---|---|---|
| Inner Join | pd.merge(df1, df2, on='ID') | ๊ณตํต ID๋ง ์ ์ง |
| Outer Join | pd.merge(df1, df2, on='ID', how='outer') | ๋ชจ๋ ID ํฌํจ, ๊ฒฐ์ธก๊ฐ NaN |
| Left Join | pd.merge(df1, df2, on='ID', how='left') | df1 ๊ธฐ์ค ์ ์ง |
| Right Join | pd.merge(df1, df2, on='ID', how='right') | df2 ๊ธฐ์ค ์ ์ง |
์นด๋๋น(Credit Card Debt)๊ณผ ๋์ด(Age) ์ ๋ณด๋ ํฉ์น ์ ์๋ค.
bank_credit_age_df = pd.DataFrame({
'Bank Client ID': [1,2,3,4,5,6,7,8,9,10],
'Credit Card Debt': [119, 12, 60, 72, 0, 20, 360, 127, 3000, 262],
'Age': [44, 35, 67, 19, 22, 45, 48, 33, 34, 36]
})
bank_all_df = pd.merge(merged_df, bank_credit_age_df, on='Bank Client ID')
๊ฒฐ๊ณผ:
๋ชจ๋ ๊ณ ๊ฐ ๋ฐ์ดํฐ(์ด๋ฆยท์ฐ๋ดยท์นด๋๋นยท๋์ด)๊ฐ ํ ํ
์ด๋ธ์ ํตํฉ๋๋ค.
apply()apply() ๊ธฐ๋ณธ ๊ฐ๋
๊ฐ ํ(row) ๋๋ ์ด(column)์ ํจ์๋ฅผ ์ ์ฉํ๋ค.
๋ณต์กํ ์ฐ์ฐ์ ๋ฒกํฐํ ์ฐ์ฐ์ฒ๋ผ ์ฒ๋ฆฌํ ์ ์์ด ํจ์จ์ ์ด๋ค.
bank_all_df['Debt Ratio'] = bank_all_df.apply(
lambda row: row['Credit Card Debt'] / row['Annual Salary [$]'],
axis=1
)
axis=1 โ ํ ๊ธฐ์คlambda โ ๊ฐ๋จํ ํ ์ค์ง๋ฆฌ ํจ์bank_all_df['Risk Level'] = bank_all_df['Debt Ratio'].apply(
lambda x: 'High' if x > 0.5 else 'Low'
)
โก ๊ณ ๊ฐ๋ณ ๋ถ์ฑ ๋น์จ๊ณผ ๋ฆฌ์คํฌ ๋ฑ๊ธ์ ์๋ ๊ณ์ฐ.
applymap()๊ณผ map() ๋น๊ต| ํจ์ | ์ ์ฉ ๋จ์ | ์ฃผ์ ์ฌ์ฉ์ฒ |
|---|---|---|
map() | Series(1์ฐจ์) | ํ ์ด์ ๊ฐ๋จํ ๋ณํ ์ ์ฉ |
apply() | ํ ๋๋ ์ด ๋จ์ | ๋ค์ค ์ด ๊ธฐ๋ฐ ๊ณ์ฐ |
applymap() | ์ ์ฒด DataFrame ์์๋ณ | ์ซ์๋ ๋ฌธ์์ด ํฌ๋งท ์ผ๊ด ๋ณ๊ฒฝ |
์์:
df.map(str.upper) # Series
df.apply(np.log1p) # DataFrame ์ํ ๋ณํ
df.applymap(lambda x: x.strip() if isinstance(x, str) else x)
| ์ฃผ์ | ํต์ฌ ๋ฌธ๋ฒ | ์ค๋ฌด ํ์ฉ ํฌ์ธํธ |
|---|---|---|
| concat | pd.concat([df1, df2], ignore_index=True) | ๋จ์ ๊ฒฐํฉ, ๋ฐ์ดํฐ ์ถ์ |
| keys | pd.concat(..., keys=['A','B']) | ๋ฉํฐ ์ธ๋ฑ์ค ๊ตฌ์ฑ |
| merge | pd.merge(df1, df2, on='๊ณตํต์ด') | SQL์ ๋ณํฉ |
| join | df1.join(df2) | ์ธ๋ฑ์ค ๊ธฐ์ค ๋ณํฉ |
| apply | df.apply(lambda row: ...) | ์ฌ์ฉ์ ์ ์ ์ ์ฒ๋ฆฌ |
| lambda | lambda x: x*1000 | ๋น ๋ฅธ ํจ์ ์ ์ |
concat โ ๋ฐ์ดํฐ ์๊ธฐ (ํ ๊ธฐ์ค)merge โ ๋ฐ์ดํฐ ๋ง๋ถ์ด๊ธฐ (์ด ๊ธฐ์ค)apply โ ๋ฐ์ดํฐ ๋ค๋ฌ๊ธฐ (ํจ์ ์ ์ฉ)mergeapply๋ก ๋ถ์ฑ๋น์จ, ์ฐ๋ น๋ ์นดํ
๊ณ ๋ฆฌํ ๋ฑ ์๋ ๊ณ์ฐkeys๋ก ๋ฉํฐ ์ธ๋ฑ์ค ๊ตฌ์ฑ ํ ๊ทธ๋ฃน ๋ถ์