Chapter 12. Pandas II#
ํ์ต๋ชฉํ์ ๊ธฐ๋ํจ๊ณผ
ํ์ต๋ชฉํ
ํ์ผ ์ ์ถ๋ ฅ ๋ฐฉ๋ฒ์ ์ตํ๋ณด์.
๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๊ด๋ จ๋ ํจ์๋ฅผ ์ตํ๋ณด์.
ChatGPT๋ฅผ ํ์ฉํ์ฌ ํ์ด์ฌ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์.
๊ธฐ๋ํจ๊ณผ
ChatGPT์ pandas๋ฅผ ํ์ฉํ์ฌ ๋ค์ํ ๋ฐ์ดํฐ ์ฐ์ฐ ๋ฐ ๋ถ์์ ํ์ํ ๊ธฐ๋ฅ์ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ์ฝ๋ฉํ ์ ์๋ค.
ํ์ผ ์ ์ถ๋ ฅ#
ํ์ผ ํ์ |
์ฝ๊ธฐ |
์ฐ๊ธฐ |
---|---|---|
MS Excel |
read_excel |
to_excel |
CSV |
read_csv |
to_csv |
JSON |
read_json |
to_json |
HTML |
read_html |
to_html |
Local clipboard |
read_clipboard |
to_clipboard |
HDF5 format |
read_hdf |
to_hdf |
SQL |
read_sql |
to_sql |
csv ํ์ผ์ ๋ถ๋ฌ์ฌ ๋
pd.read_csv(โํ์ผ๋ช โ, index_col=์นผ๋ผ๋ฒํธ, encoding=โ์ธ์ฝ๋ฉ๋ฐฉ๋ฒโ)
index_col:์นผ๋ผ๋ฒํธ๋ฅผ ์ค์ ์ธ๋ฑ์ค๋ก ์ง์ ํ๋ค.
usecols: ์ฌ์ฉํ ์นผ๋ผ๋ฒํธ๋ฅผ ์ง์ ํ๋ค.
header: ํค๋(์นผ๋ผ)์ผ๋ก ์ ํํ ํค๋๋ฅผ ์ง์ ํ๋ค.
encoding: ํ๊ธ์ด ๊นจ์ง๋์๋ encoding ์ต์ ์ โeuc-krโ์ ๋ฃ์ด์ค๋ค.
์ด ์ธ์๋ ๋ง์ ์ต์ ์ด ์๋ค.
excelํ์ผ์ ๋ถ๋ฌ์ฌ ๋
pd.read_excel(โํ์ผ๋ช โ, encoding=โ์ธ์ฝ๋ฉ๋ฐฉ๋ฒโ)
์ธ์ฝ๋ฉ & ๋์ฝ๋ฉ
์ธ์ฝ๋ฉ(encoding)๋ ์ฝ๋ํ ๋๋ ์ํธํ๋ก ๋ถ๋ฆฌ์ฐ๋ฉฐ, ๋ฌธ์์ด์ ๋ฐ์ดํธ์ฝ๋๋ก ๋ณํํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
ํ์ด์ฌ์์๋ ๋ฌธ์์ด์ ์ ๋์ฝ๋๋ก ์ฒ๋ฆฌํ๋๋ฐ ์ ๋์ฝ๋๋ฅผ utf-8, euc-kr, ascii ํ์์ ์ธ์ฝ๋ฉ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํธ์ฝ๋๋ก ๋ณํํ๋ค. ์๋ฅผ ๋ค์ด,
x='ํ๊ธ'
encoded = x.encode('utf-8')
print(f'Output: {encoded}')
Output: bโ\xed\x95\x9c\xea\xb8\x80โ
์ฌ๊ธฐ์ ๊ฒฐ๊ณผ๋ก ๋์จ bโ\xed\x95\x9c\xea\xb8\x80โ๊ฐ ๋ฐ์ดํธ ์ฝ๋์ด๋ค.
๋์ฝ๋ฉ(decoding)์ ์ญ์ฝ๋ํ ๋๋ ๋ณตํธํ๋ก ๋ถ๋ฆฌ์ฐ๋ฉฐ, ๋ฐ์ดํธ์ฝ๋๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
์ด๋ ๋์ฝ๋ฉ์์๋ ์ธ์ฝ๋ฉ ์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ ์ธ์ฝ๋ฉ ๋ฐฉ์(utf-8, euc-kr, ascii ๋ฑ)์ด ์ฌ์ฉ๋์ด์ผ ํ๋ค.
decoded = encoded.decode('utf-8')
print(f'Output: {decoded}')
Output: ํ๊ธ
์ธ์ฝ๋ฉ์ ํ๋ ์ด์ ๋ ์ธ์ด๋ง๋ค ํ์คํ๋ ๊ท๊ฒฉ์ผ๋ก ๋ฌธ์์งํฉ์ ๋ง๋ค๊ณ , ์ด๋ฌํ ๋ฌธ์์งํฉ์ ๊ฐ์ง๊ณ ์ ๋ณด์ ํํ ํ์คํ, ๋ณด์, ์ ์ฅ ๊ณต๊ฐ ์ ์ฝ ๋ฑ์ ๋ค์ํ ๋ชฉ์ ์ผ๋ก ๋ถํธํํ์ฌ ์ฌ์ฉํ๊ธฐ ์ํ ๊ฒ์ด๋ค.
ํ์ผ ์ฝ๊ณ ์ ์ฅํ๊ธฐ
import pandas as pd
scores = [[84,87,78], [21,15,84], [87,84,76], [100,87,99],[59,99,59],[46,77,56]]
names=['์ฒ ์','์์ด','๊ธธ๋','๋ฏธ์','์์ด','์ฒ ์ด']
lectures=['๊ตญ์ด','์ํ','์์ด']
d1 = pd.DataFrame(scores, index=names, columns=lectures)
d1
๊ตญ์ด | ์ํ | ์์ด | |
---|---|---|---|
์ฒ ์ | 84 | 87 | 78 |
์์ด | 21 | 15 | 84 |
๊ธธ๋ | 87 | 84 | 76 |
๋ฏธ์ | 100 | 87 | 99 |
์์ด | 59 | 99 | 59 |
์ฒ ์ด | 46 | 77 | 56 |
# ์์
๋ก ์ ์ฅํ๊ธฐ
d1.to_excel('sample.xlsx')
# ์์
์ฝ์ด์ค๊ธฐ
d2 = pd.read_excel("sample.xlsx")
d2
Unnamed: 0 | ๊ตญ์ด | ์ํ | ์์ด | |
---|---|---|---|---|
0 | ์ฒ ์ | 84 | 87 | 78 |
1 | ์์ด | 21 | 15 | 84 |
2 | ๊ธธ๋ | 87 | 84 | 76 |
3 | ๋ฏธ์ | 100 | 87 | 99 |
4 | ์์ด | 59 | 99 | 59 |
5 | ์ฒ ์ด | 46 | 77 | 56 |
index_col ์ต์ ์ ์ธ๋ฑ์ค ์นผ๋ผ์ ์ง์ ํ์ฌ ์ฝ์ด์ฌ ์ ์๊ฒ ํด์ค๋ค.
d2 = pd.read_excel("sample.xlsx", index_col=0)
d2
๊ตญ์ด | ์ํ | ์์ด | |
---|---|---|---|
์ฒ ์ | 84 | 87 | 78 |
์์ด | 21 | 15 | 84 |
๊ธธ๋ | 87 | 84 | 76 |
๋ฏธ์ | 100 | 87 | 99 |
์์ด | 59 | 99 | 59 |
์ฒ ์ด | 46 | 77 | 56 |
# csv๋ก ์ ์ฅํ๊ธฐ
d2.to_csv('sample.csv', encoding='euc-kr')
d2 = pd.read_csv('sample.csv', encoding='euc-kr', index_col=0)
d2
๊ตญ์ด | ์ํ | ์์ด | |
---|---|---|---|
์ฒ ์ | 84 | 87 | 78 |
์์ด | 21 | 15 | 84 |
๊ธธ๋ | 87 | 84 | 76 |
๋ฏธ์ | 100 | 87 | 99 |
์์ด | 59 | 99 | 59 |
์ฒ ์ด | 46 | 77 | 56 |
์๋ฃํ ๋ค๋ฃจ๊ธฐ#
.astype(์๋ฃํ)
d2 = d1.astype('str')
d2
๊ตญ์ด | ์ํ | ์์ด | |
---|---|---|---|
์ฒ ์ | 84 | 87 | 78 |
์์ด | 21 | 15 | 84 |
๊ธธ๋ | 87 | 84 | 76 |
๋ฏธ์ | 100 | 87 | 99 |
์์ด | 59 | 99 | 59 |
์ฒ ์ด | 46 | 77 | 56 |
d2.sum()
๊ตญ์ด 8.421871e+12
์ํ 8.715849e+11
์์ด 7.884770e+11
dtype: float64
๋๋ฝ๊ฐ ์ฒ๋ฆฌํ๊ธฐ#
๋๋ฝ ๋ฐ์ดํฐ ํ์ธ
isnull(): ๋๋ฝ ๋ฐ์ดํฐ์ด๋ฉด True, ์ ํจํ ๋ฐ์ดํฐ์ด๋ฉด False๋ฅผ ๋ฐํ
notnull():์ ํจํ ๋ฐ์ดํฐ์ด๋ฉด True, ๋๋ฝ๋ฐ์ดํฐ์ด๋ฉด False๋ฅผ ๋ฐํ
scores = [[84,87,78], [21,15,84], [87,84,76], [100,87,99],[59,99,59],[46,77,56]]
names=['์ฒ ์','์์ด','๊ธธ๋','์ฌ๊ธฐ','์์ด','์ฒ ์ด']
lectures=['๊ตญ์ด','์ํ','์์ด']
d2 = pd.DataFrame(scores, index=names, columns=lectures)
d2
๊ตญ์ด | ์ํ | ์์ด | |
---|---|---|---|
์ฒ ์ | 84 | 87 | 78 |
์์ด | 21 | 15 | 84 |
๊ธธ๋ | 87 | 84 | 76 |
์ฌ๊ธฐ | 100 | 87 | 99 |
์์ด | 59 | 99 | 59 |
์ฒ ์ด | 46 | 77 | 56 |
d3=d1+d2
d3
๊ตญ์ด | ์ํ | ์์ด | |
---|---|---|---|
๊ธธ๋ | 174.0 | 168.0 | 152.0 |
๋ฏธ์ | NaN | NaN | NaN |
์์ด | 118.0 | 198.0 | 118.0 |
์ฌ๊ธฐ | NaN | NaN | NaN |
์์ด | 42.0 | 30.0 | 168.0 |
์ฒ ์ | 168.0 | 174.0 | 156.0 |
์ฒ ์ด | 92.0 | 154.0 | 112.0 |
d3.isnull()
#d3.notnull()
๊ตญ์ด | ์ํ | ์์ด | |
---|---|---|---|
๊ธธ๋ | False | False | False |
๋ฏธ์ | True | True | True |
์์ด | False | False | False |
์ฌ๊ธฐ | True | True | True |
์์ด | False | False | False |
์ฒ ์ | False | False | False |
์ฒ ์ด | False | False | False |
๋๋ฝ ๋ฐ์ดํฐ ์ ๊ฑฐ
ํ์ ๊ฑฐ: .dropna(subset=์นผ๋ผ๋ช , how=โanyโ/โallโ, axis=0, thresh=๊ฐ์)
์ด์ ๊ฑฐ: .dropna(axis=1, thresh=๊ฐ์)
how
any: ํ๋๋ผ๋ ๋น์ด ์์ผ๋ฉด ์ญ์
all: ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ๋น์ด ์์ผ๋ฉด ์ญ์
thresh: ์ ํจํ ๊ฐ์ ๊ฐ์๊ฐ thresh๋ณด๋ค ์์ ํ์ด๋ ์ด์ ์ญ์
d4=d3.dropna(axis=0)
d4
๊ตญ์ด | ์ํ | ์์ด | |
---|---|---|---|
๊ธธ๋ | 174.0 | 168.0 | 152.0 |
์์ด | 118.0 | 198.0 | 118.0 |
์์ด | 42.0 | 30.0 | 168.0 |
์ฒ ์ | 168.0 | 174.0 | 156.0 |
์ฒ ์ด | 92.0 | 154.0 | 112.0 |
๋๋ฝ ๋ฐ์ดํฐ ์นํ
.fillna(๊ฐ)
min_kor = d3['๊ตญ์ด'].min()
d3['๊ตญ์ด'].fillna(min_kor, inplace=True)
d3
๊ตญ์ด | ์ํ | ์์ด | |
---|---|---|---|
๊ธธ๋ | 174.0 | 168.0 | 152.0 |
๋ฏธ์ | 42.0 | NaN | NaN |
์์ด | 118.0 | 198.0 | 118.0 |
์ฌ๊ธฐ | 42.0 | NaN | NaN |
์์ด | 42.0 | 30.0 | 168.0 |
์ฒ ์ | 168.0 | 174.0 | 156.0 |
์ฒ ์ด | 92.0 | 154.0 | 112.0 |
์ค๋ณต๋ฐ์ดํฐ ์ฒ๋ฆฌ#
.duplicated(): ์ค๋ณต๋ ํ์ด๋ฉด True, ์๋๋ฉด False์ด๋ค.
d3
๊ตญ์ด | ์ํ | ์์ด | |
---|---|---|---|
๊ธธ๋ | 174.0 | 168.0 | 152.0 |
๋ฏธ์ | 42.0 | NaN | NaN |
์์ด | 118.0 | 198.0 | 118.0 |
์ฌ๊ธฐ | 42.0 | NaN | NaN |
์์ด | 42.0 | 30.0 | 168.0 |
์ฒ ์ | 168.0 | 174.0 | 156.0 |
์ฒ ์ด | 92.0 | 154.0 | 112.0 |
d3.duplicated()
๊ธธ๋ False
๋ฏธ์ False
์์ด False
์ฌ๊ธฐ True
์์ด False
์ฒ ์ False
์ฒ ์ด False
dtype: bool
d3['๊ตญ์ด'].duplicated()
๊ธธ๋ False
๋ฏธ์ False
์์ด False
์ฌ๊ธฐ True
์์ด True
์ฒ ์ False
์ฒ ์ด False
Name: ๊ตญ์ด, dtype: bool
์ค๋ณตํ ์ ๊ฑฐ: .drop_duplicates(subset=์ปฌ๋ผ๋ช ๋ฆฌ์คํธ)
d3
๊ตญ์ด | ์ํ | ์์ด | |
---|---|---|---|
๊ธธ๋ | 174.0 | 168.0 | 152.0 |
๋ฏธ์ | 42.0 | NaN | NaN |
์์ด | 118.0 | 198.0 | 118.0 |
์ฌ๊ธฐ | 42.0 | NaN | NaN |
์์ด | 42.0 | 30.0 | 168.0 |
์ฒ ์ | 168.0 | 174.0 | 156.0 |
์ฒ ์ด | 92.0 | 154.0 | 112.0 |
d3.drop_duplicates(subset=['๊ตญ์ด', '์์ด'])
๊ตญ์ด | ์ํ | ์์ด | |
---|---|---|---|
๊ธธ๋ | 174.0 | 168.0 | 152.0 |
๋ฏธ์ | 42.0 | NaN | NaN |
์์ด | 118.0 | 198.0 | 118.0 |
์์ด | 42.0 | 30.0 | 168.0 |
์ฒ ์ | 168.0 | 174.0 | 156.0 |
์ฒ ์ด | 92.0 | 154.0 | 112.0 |
์๊ณ์ด ๋ฐ์ดํฐ#
๋ค๋ฅธ ์๋ฃํ์ ์๊ณ์ด ๊ฐ์ฒด๋ก ๋ณํ
to_datetime(): ๋ฌธ์์ด์ timestamp๋ก ๋ณํ
data = [['1990-03-02', 90], ['1991-08-08', 95], ['1990-11-22',90], ['1991-01-05', 88]]
names=['์ฒ ์','์์ด','๊ธธ๋','๋ฏธ์']
column=['์๋
์์ผ','์ ์']
d1 = pd.DataFrame(data, index=names, columns=column)
d1
์๋ ์์ผ | ์ ์ | |
---|---|---|
์ฒ ์ | 1990-03-02 | 90 |
์์ด | 1991-08-08 | 95 |
๊ธธ๋ | 1990-11-22 | 90 |
๋ฏธ์ | 1991-01-05 | 88 |
์๋ ์์ผ์ ํ์ธํด๋ณด๋ฉด object ํ์ ์ด๋ค.
d1.info()
<class 'pandas.core.frame.DataFrame'>
Index: 4 entries, ์ฒ ์ to ๋ฏธ์
Data columns (total 2 columns):
์๋
์์ผ 4 non-null object
์ ์ 4 non-null int64
dtypes: int64(1), object(1)
memory usage: 96.0+ bytes
object ํ์ ์ ์๋ ์์ผ์ ์๊ณ์ด ๋ฐ์ดํฐํ์ ์ธ datetimeํ์ผ๋ก ๋ฐ๊ฟ๋ณด์.
d1['์๋
์์ผ'] = pd.to_datetime(d1['์๋
์์ผ'])
d1
์๋ ์์ผ | ์ ์ | |
---|---|---|
์ฒ ์ | 1990-03-02 | 90 |
์์ด | 1991-08-08 | 95 |
๊ธธ๋ | 1990-11-22 | 90 |
๋ฏธ์ | 1991-01-05 | 88 |
datetime์ผ๋ก ๋ณํํ ํ์ธํด๋ณด๋ฉด ํ์ ์ด ๋ณ๊ฒฝ๋ ๊ฒ์ ์ ์ ์๋ค.
d1.info()
<class 'pandas.core.frame.DataFrame'>
Index: 4 entries, ์ฒ ์ to ๋ฏธ์
Data columns (total 2 columns):
์๋
์์ผ 4 non-null datetime64[ns]
์ ์ 4 non-null int64
dtypes: datetime64[ns](1), int64(1)
memory usage: 96.0+ bytes
์๊ณ์ด ๋ฐ์ดํฐ ํ์ฉ
๋ ์ง ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌํ ์ ์๋ค.
์ฐ-์-์ผ ์ ๋ณด์์ ์ฐ,์,์ผ ์ถ์ถ: dt.year, dt.month, dt.day๋ฅผ ์ฌ์ฉ
d1['๋
'] = d1['์๋
์์ผ'].dt.year
d1['์'] = d1['์๋
์์ผ'].dt.month
d1['์ผ'] = d1['์๋
์์ผ'].dt.day
d1
์๋ ์์ผ | ์ ์ | ๋ | ์ | ์ผ | |
---|---|---|---|---|---|
์ฒ ์ | 1990-03-02 | 90 | 1990 | 3 | 2 |
์์ด | 1991-08-08 | 95 | 1991 | 8 | 8 |
๊ธธ๋ | 1990-11-22 | 90 | 1990 | 11 | 22 |
๋ฏธ์ | 1991-01-05 | 88 | 1991 | 1 | 5 |
์ฐ-์-์ผ ์ ๋ณด์์ ์ฐ-์ ์ถ์ถ: dt.to_period()๋ฅผ ์ฌ์ฉ
df.to_period(freq=None, axis=0, copy=True)
freq : ์ํ๋ ์๊ฐ ๋จ์๋ก ๋ณํ(โYโ,โMโ,โDโ, โWโ)
axis : ๋ณํํ ๊ธฐ์ค ์ถ
copy : ์ฌ๋ณธ์ ํ์ฑํ ์ง ์ฌ๋ถ
d1
์๋ ์์ผ | ์ ์ | ๋ | ์ | ์ผ | |
---|---|---|---|---|---|
์ฒ ์ | 1990-03-02 | 90 | 1990 | 3 | 2 |
์์ด | 1991-08-08 | 95 | 1991 | 8 | 8 |
๊ธธ๋ | 1990-11-22 | 90 | 1990 | 11 | 22 |
๋ฏธ์ | 1991-01-05 | 88 | 1991 | 1 | 5 |
d1['๋
์'] = d1['์๋
์์ผ'].dt.to_period(freq='M')
d1
์๋ ์์ผ | ์ ์ | ๋ | ์ | ์ผ | ๋ ์ | |
---|---|---|---|---|---|---|
์ฒ ์ | 1990-03-02 | 90 | 1990 | 3 | 2 | 1990-03 |
์์ด | 1991-08-08 | 95 | 1991 | 8 | 8 | 1991-08 |
๊ธธ๋ | 1990-11-22 | 90 | 1990 | 11 | 22 | 1990-11 |
๋ฏธ์ | 1991-01-05 | 88 | 1991 | 1 | 5 | 1991-01 |
๋ ์ง ์ธ๋ฑ์ค ํ์ฉ
d2 = d1.set_index(['์๋
์์ผ'])
d2
์ ์ | ๋ | ์ | ์ผ | ๋ ์ | |
---|---|---|---|---|---|
์๋ ์์ผ | |||||
1990-03-02 | 90 | 1990 | 3 | 2 | 1990-03 |
1991-08-08 | 95 | 1991 | 8 | 8 | 1991-08 |
1990-11-22 | 90 | 1990 | 11 | 22 | 1990-11 |
1991-01-05 | 88 | 1991 | 1 | 5 | 1991-01 |
d2.index
DatetimeIndex(['1990-03-02', '1991-08-08', '1990-11-22', '1991-01-05'], dtype='datetime64[ns]', name='์๋
์์ผ', freq=None)
d2.loc['1990-03']
์ ์ | ๋ | ์ | ์ผ | ๋ ์ | |
---|---|---|---|---|---|
์๋ ์์ผ | |||||
1990-03-02 | 90 | 1990 | 3 | 2 | 1990-03 |
d2.loc['1990']
์ ์ | ๋ | ์ | ์ผ | ๋ ์ | |
---|---|---|---|---|---|
์๋ ์์ผ | |||||
1990-03-02 | 90 | 1990 | 3 | 2 | 1990-03 |
1990-11-22 | 90 | 1990 | 11 | 22 | 1990-11 |
์ ํํ ์ธ๋ฑ์ค๋ก ์์ํด์ผ ํ๋ค.
d2.loc['1990-03-02':'1990-12-31']
์ ์ | ๋ | ์ | ์ผ | ๋ ์ | |
---|---|---|---|---|---|
์๋ ์์ผ | |||||
1990-03-02 | 90 | 1990 | 3 | 2 | 1990-03 |
1990-11-22 | 90 | 1990 | 11 | 22 | 1990-11 |
today = pd.to_datetime('2024-05-14')
today
Timestamp('2024-05-14 00:00:00')
d2['๋ ์ง_์ฐจ์ด'] = today-d2.index
d2
์ ์ | ๋ | ์ | ์ผ | ๋ ์ | ๋ ์ง_์ฐจ์ด | |
---|---|---|---|---|---|---|
์๋ ์์ผ | ||||||
1990-03-02 | 90 | 1990 | 3 | 2 | 1990-03 | 12492 days |
1991-08-08 | 95 | 1991 | 8 | 8 | 1991-08 | 11968 days |
1990-11-22 | 90 | 1990 | 11 | 22 | 1990-11 | 12227 days |
1991-01-05 | 88 | 1991 | 1 | 5 | 1991-01 | 12183 days |
melt()๋ฅผ ์ด์ฉํ ๋ฐ์ดํฐ ์ ๋ฆฌ#
๋์ ๋ฐ์ดํฐ: ๋ฐ์ดํฐ์ ์ด ์ด๋ฆ์ด ์ด๋ค ๊ฐ์ ์๋ฏธํ๋ฉด ์ด์ ํญ์ด ๋์ ๊ฒฝ์ฐ๊ฐ ๋ง์
melt()๋ฉ์๋๋ ์ง์ ํ ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ํ์ผ๋ก ์ ๋ฆฌํด์ค๋ค.
id_vars: ์์น๋ฅผ ๊ทธ๋๋ก ์ ์งํ ์ด์ ์ด๋ฆ์ ์ง์
value_vars: ํ์ผ๋ก ์์น๋ฅผ ๋ณ๊ฒฝํ ์ด์ ์ด๋ฆ์ ์ง์ . ์ง์ ํ์ง ์์ผ๋ฉด id_vars์์ ๋ช ์ํ ์ด์ ์ ์ธํ ๋ชจ๋ ์ด์ด ํ์ผ๋ก ๋ณ๊ฒฝ๋๋ค.
var_name: value_vars๋ก ์์น๋ฅผ ๋ณ๊ฒฝํ ์ด์ ์ด๋ฆ์ ์ง์
value_name: var_name์ผ๋ก ์์น๋ฅผ ๋ณ๊ฒฝํ ์ด์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ด์ ์ด๋ฆ์ ์ง์
# ์ข
๊ต์ ์๋ ์์ค ๊ฐ์ ๊ด๊ณ์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ๋ฐ์ดํฐ
# Pew Research Center Religion & Public Life ์น์ฌ์ดํธ
a = ['religion', '<$10k', '$10-20k', '$20-30k', '$30-40k', '$40-50k', '$50-75k', \
'$75-100k','$100-150k', '>150k', "Don't know/refused"]
data =[['Agnostic', 27, 34, 60, 81, 76, 137, 122, 109, 84, 96],\
['Atheist', 12, 27, 37, 52, 35, 70, 73, 59, 74, 76], \
['Buddhist', 27, 21, 30, 34, 33, 58, 62, 39, 53, 54], \
['Catholic', 418, 617, 732, 670, 638, 1116, 949, 792, 633, 1489], \
["Don't know/refused", 15, 14, 15, 11, 10, 35, 21, 17, 18, 116]]
df=pd.DataFrame(data, columns=a)
df
religion | <$10k | $10-20k | $20-30k | $30-40k | $40-50k | $50-75k | $75-100k | $100-150k | >150k | Don't know/refused | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | Agnostic | 27 | 34 | 60 | 81 | 76 | 137 | 122 | 109 | 84 | 96 |
1 | Atheist | 12 | 27 | 37 | 52 | 35 | 70 | 73 | 59 | 74 | 76 |
2 | Buddhist | 27 | 21 | 30 | 34 | 33 | 58 | 62 | 39 | 53 | 54 |
3 | Catholic | 418 | 617 | 732 | 670 | 638 | 1116 | 949 | 792 | 633 | 1489 |
4 | Don't know/refused | 15 | 14 | 15 | 11 | 10 | 35 | 21 | 17 | 18 | 116 |
1๊ฐ์ ์ด๋ง ๊ณ ์ ํ๊ณ ๋๋จธ์ง ์ด์ ํ์ผ๋ก ๋ฐ๊พธ๊ธฐ
pew_long = pd.melt(df, id_vars='religion', var_name='income', value_name='count')
pew_long
religion | income | count | |
---|---|---|---|
0 | Agnostic | <$10k | 27 |
1 | Atheist | <$10k | 12 |
2 | Buddhist | <$10k | 27 |
3 | Catholic | <$10k | 418 |
4 | Don't know/refused | <$10k | 15 |
5 | Agnostic | $10-20k | 34 |
6 | Atheist | $10-20k | 27 |
7 | Buddhist | $10-20k | 21 |
8 | Catholic | $10-20k | 617 |
9 | Don't know/refused | $10-20k | 14 |
10 | Agnostic | $20-30k | 60 |
11 | Atheist | $20-30k | 37 |
12 | Buddhist | $20-30k | 30 |
13 | Catholic | $20-30k | 732 |
14 | Don't know/refused | $20-30k | 15 |
15 | Agnostic | $30-40k | 81 |
16 | Atheist | $30-40k | 52 |
17 | Buddhist | $30-40k | 34 |
18 | Catholic | $30-40k | 670 |
19 | Don't know/refused | $30-40k | 11 |
20 | Agnostic | $40-50k | 76 |
21 | Atheist | $40-50k | 35 |
22 | Buddhist | $40-50k | 33 |
23 | Catholic | $40-50k | 638 |
24 | Don't know/refused | $40-50k | 10 |
25 | Agnostic | $50-75k | 137 |
26 | Atheist | $50-75k | 70 |
27 | Buddhist | $50-75k | 58 |
28 | Catholic | $50-75k | 1116 |
29 | Don't know/refused | $50-75k | 35 |
30 | Agnostic | $75-100k | 122 |
31 | Atheist | $75-100k | 73 |
32 | Buddhist | $75-100k | 62 |
33 | Catholic | $75-100k | 949 |
34 | Don't know/refused | $75-100k | 21 |
35 | Agnostic | $100-150k | 109 |
36 | Atheist | $100-150k | 59 |
37 | Buddhist | $100-150k | 39 |
38 | Catholic | $100-150k | 792 |
39 | Don't know/refused | $100-150k | 17 |
40 | Agnostic | >150k | 84 |
41 | Atheist | >150k | 74 |
42 | Buddhist | >150k | 53 |
43 | Catholic | >150k | 633 |
44 | Don't know/refused | >150k | 18 |
45 | Agnostic | Don't know/refused | 96 |
46 | Atheist | Don't know/refused | 76 |
47 | Buddhist | Don't know/refused | 54 |
48 | Catholic | Don't know/refused | 1489 |
49 | Don't know/refused | Don't know/refused | 116 |
ํผ๋ฒ ํ ์ด๋ธ์ ์ด์ฉํ ๋ฐ์ดํฐ ์ ๋ฆฌ#
ํผ๋ฒ ํ ์ด๋ธ: ๋ฐ์ดํฐ๋ฅผ ์์ฝํ๊ณ ๋ถ์ํ๋ ๋ฐ ์ฌ์ฉํ๋ ํ ์ด๋ธ
์์ ๋ฐ์ดํฐ๋ฅผ ํ๋์ ๋ณผ ์ ์๋๋ก ์ฌ๊ตฌ์ฑํ๊ณ , ํ์์ ๋ฐ๋ผ ํน์ ๋ณ์์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํ๊ฑฐ๋ ์ง๊ณํ ์ ์์
.pivot_table(df, index=์ธ๋ฑ์ค๋ฆฌ์คํธ, values=๊ฐ๋ฆฌ์คํธ)
salesfunnel.xlsx: ํ๋งค ๊ฑฐ๋ ๋ฐ์ดํฐ
Account: ๊ฑฐ๋๋ฅผ ์งํํ ๊ณ ๊ฐ์ ๊ณ์ ๋ฒํธ
Name: ๊ณ ๊ฐ์ ์ด๋ฆ
Rep: ๊ฑฐ๋๋ฅผ ์งํํ ํ๋งค ๋ํ
Manager: ํ๋งค ๋ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋งค๋์
Product: ๊ฑฐ๋๋ ์ ํ
Quantity: ๊ฑฐ๋๋ ์ ํ์ ์๋
Price: ์ ํ ๋จ๊ฐ
Status: ๊ฑฐ๋์ ์ํ (presented, pending, declined ๋ฑ)
df = pd.read_excel('https://raw.githubusercontent.com/HaesunByun/common/main/data/salesfunnel.xlsx')
df.head()
Account | Name | Rep | Manager | Product | Quantity | Price | Status | |
---|---|---|---|---|---|---|---|---|
0 | 714466 | Trantow-Barrows | Craig Booker | Debra Henley | CPU | 1 | 30000 | presented |
1 | 714466 | Trantow-Barrows | Craig Booker | Debra Henley | Software | 1 | 10000 | presented |
2 | 714466 | Trantow-Barrows | Craig Booker | Debra Henley | Maintenance | 2 | 5000 | pending |
3 | 737550 | Fritsch, Russel and Anderson | Craig Booker | Debra Henley | CPU | 1 | 35000 | declined |
4 | 146832 | Kiehn-Spinka | Daniel Hilton | Debra Henley | CPU | 2 | 65000 | won |
index๋ ๊ทธ๋ฃนํํ ์ด์ ์ด๋ฆ์ด๋ค.
์๋ ์์ ์์๋ Manager์ Rep๋ฅผ index๋ก ํ์ฌ ๊ทธ๋ฃนํํ๋ฉฐ, ๊ทธ๋ฃนํํ values๋ โpriceโ์ด๋ค.
value๋ฅผ pivot_table๋ก ํฉ์น ๊ฒฝ์ฐ ๋ํดํธ๋ก ํ๊ท ์น๋ก ๊ณ์ฐ๋๋ค.
pd.pivot_table(df, index=['Manager', 'Rep'], values=['Price'])
Price | ||
---|---|---|
Manager | Rep | |
Debra Henley | Craig Booker | 20000.000000 |
Daniel Hilton | 38333.333333 | |
John Smith | 20000.000000 | |
Fred Anderson | Cedric Moss | 27500.000000 |
Wendy Yule | 44250.000000 |
value์ ๊ฐ์ ํฉ์ฐ์ผ๋ก ํ๊ณ ์ถ์ ๋ aggfunc์ต์ ์ sumํจ์์ ์ด๋ฆ์ ์ด๋ค.
pd.pivot_table(df, index=['Manager', 'Rep'], values=['Price'], aggfunc=sum)
Price | ||
---|---|---|
Manager | Rep | |
Debra Henley | Craig Booker | 80000 |
Daniel Hilton | 115000 | |
John Smith | 40000 | |
Fred Anderson | Cedric Moss | 110000 |
Wendy Yule | 177000 |
ChatGPT ํ์ฉํ๊ธฐ#
ChatGPT(Generative Pre-trained Transformer)๋ ๋ฏธ๊ตญ์ AI ์ฐ๊ตฌ์ฌ๋จ OpenAI๊ฐ 2022๋ 11์ ๊ณต๊ฐํ ์ด๊ฑฐ๋ ์ธ์ด๋ชจ๋ธ GPT-3.5 ๊ธฐ๋ฐ ๋ํํ ์ธ๊ณต์ง๋ฅ ์ฑ๋ด์ด๋ค.
Generative(์์ฑํ), Pre-trained(๋ฏธ๋ฆฌ ํ์ต๋) Transformer(๋ณํ๊ธฐ)
ํ์ฌ Chat GPT ํํ์ด์ง(https://chat.openai.com/chat) ์์ ๋๊ตฌ๋ ๊ฐ์ ํ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
์ฌ์ฉ์๊ฐ ์ฑํ ํ๋ฏ ์ง๋ฌธ์ ์ ๋ ฅํ๋ฉด ChatGPT๋ ํ์ตํ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก โ์ฌ๋์ฒ๋ผโ ๋ฌธ์ฅ์ ๋ง๋ค์ด ๋ต์ ํด์ค๋ค.
๋ง์น ์ง์ง ์ฌ๋๊ณผ ๋ํํ๋ ๊ฒ์ฒ๋ผ ์์ฐ์ค๋ฝ๊ฒ ์ง๋ฌธ๊ณผ ๋ต๋ณ์ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ค.
๋จ์ ์ ๋ณด ์ง๊น๊ธฐ๋ฟ ์๋๋ผ ์์ธ์ดใป์์คใป์ ๋ฑ ๋ค์ํ ์ฐฝ์๋ฌผ, ์ฌ์ง์ด ํ๋ก๊ทธ๋๋ฐ ์ฝ๋๊น์ง ์์ฑํ๋ค๋ ์ ์์ ํ์ ๊ฐ ๋๊ณ ์๋ค.
์ถ์์ผ
2022. 11. 30 ์ถ์
2023. 3. 14 GPT-4 ์ถ์
2023. 3. 23 chatGPT plugins ๊ณต๊ฐ
์ง์์ ์
๋ฐ์ดํธ

ChatGPT์๊ฒ ์ง๋ฌธํ๊ธฐ#
Q. ChatGPT์๊ฒ ์ง๋ฌธํด๋ณด์ธ์.
ChatGPT๋ ๋ญ์ผ?
์ธ๊ณต์ง๋ฅ์ ๋ํ ์๋ฅผ ์์ฑํด์ค
ChatGPT ํ์ฉ ๋ถ์ผ๋ฅผ ์๋ ค์ค
Chat GPT๋ ์ ์์ด ์ํํ ์๊ฐ์ด ์ธ์ ์ผ?
Chat GPT ์ ๋ฃ์ ๋ฌด๋ฃ์ ์ฐจ์ด๋ฅผ ์ค๋ช ํด์ค
์ธ์์์ ๊ฐ์ฅ ์๋ฆ๋ค์ด ๊ณณ์?
์ธ์ต์คํผ์ด ์ํ์ ๋ํด ๊ฐ๋ฅด์ณ ์ค
์ฝ๋ฉ์ AI์ฝ๋ฉ#
์ฝ๋ฉ์์๋ AI๋ก ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
๋ค๋ง workspace๊ณ์ (์ผ๋ฐ์ ์ผ๋ก ํ์ด๋ ์กฐ์ง ๋ด์์ ํ์ ํ๊ณ ์ ๋ฌด๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๊ณ์ )์ ์ง์ํ์ง ์๋๋ค.
์ฆ ํ๊ต๋ฉ์ผ๋ก ๋ก๊ทธ์ธํ ๊ตฌ๊ธ๊ณ์ ์์๋ ์ฌ์ฉํ ์ ์๋ค.
Practice-1: Chat-GPT๋ก ์์ธ์ธ๊ตฌ๋ฐ์ดํฐ ํ์ฉํด๋ณด๊ธฐ#
๋ฐ์ดํฐ ๋ค์ด๋ก๋ ์ฌ์ดํธ : https://data.seoul.go.kr/
๊ฒ์์ด: ์์ธ์ ์์น๊ตฌ๋ณ ์ธ๊ตฌ์
๋ชฉํ:
๊ฐ ๊ตฌ๋ณ ํ๊ตญ์ธ์ ๋น์จ ๊ตฌํ๊ธฐ
๊ฐ ๊ตฌ๋ณ ์ธ๊ตญ์ธ์ ๋น์จ ๊ตฌํ๊ธฐ
๊ฐ ๊ตฌ๋ณ ๊ณ ๋ น์์ ๋น์จ ๊ตฌํ๊ธฐ
์ธ๊ตฌ์๊ฐ ์ ์ ์์๋๋ก 5๊ฐ ๊ตฌ ์ถ๋ ฅํ๊ธฐ
์ธ๊ตญ์ธ ์ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํ๊ธฐ
๊ณ ๋ น์ ๋น์จ ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๊ธฐ
์ธ๊ตฌ์๊ฐ ๊ฐ์ฅ ๋ง์ ์์น๊ตฌ์ ์ธ๊ตฌ์ ์ต๋๊ฐ ๊ตฌํ๊ธฐ
์ธ๊ตฌ์๊ฐ ๊ฐ์ฅ ์ ์ ์์น๊ตฌ์ ์ธ๊ตฌ์ ์ต์๊ฐ ๊ตฌํ๊ธฐ
์ธ๊ตฌ์์ ๊ณ ๋ น์์ ๊ฐ์ ์๊ด ๊ด๊ณ ๊ตฌํ๊ธฐ
๐ ํ์ํ ์นผ๋ผ๋ง ๋ถ๋ฌ์์ ๋ฐ์ดํํ๋ ์ ์์ฑํ๊ธฐ
๋ค์ด๋ก๋ํ ํ์ผ์ ์ด์ด์ ์๋์ ์ต์ ์ ์ฌ์ฉํ ์นผ๋ผ์ ์ดํด๋ณธ๋ค.
header: ์นผ๋ผ ์ด๋ฆ ์ง์
index_col: index๋ก ์ง์ ํ ์นผ๋ผ ์ง์
use_cols: ์ฌ์ฉํ ์นผ๋ผ ์ง์
๐ ๋ฐ์ดํํ๋ ์ ์นผ๋ผ๋ช ๋ณ๊ฒฝํ๊ธฐ
๐ ๋ฐ์ดํํ๋ ์ ์ธ๋ฑ์ค ์ค์ ํ๊ธฐ
๐ ๋ถํ์ํ ํ ์ญ์ ํ๊ธฐ
๐ ๊ฐ ๊ตฌํ๊ธฐ
๊ฐ ๊ตฌ๋ณ ํ๊ตญ์ธ์ ๋น์จ ๊ตฌํ๊ธฐ
๊ฐ ๊ตฌ๋ณ ์ธ๊ตญ์ธ์ ๋น์จ ๊ตฌํ๊ธฐ
๊ฐ ๊ตฌ๋ณ ๊ณ ๋ น์์ ๋น์จ ๊ตฌํ๊ธฐ
๐ ๊ฐ์ ๋ฐ๋ผ ์ ๋ ฌํ๊ธฐ
- ์ธ๊ตฌ์๊ฐ ์ ์ ์์๋๋ก 5๊ฐ ๊ตฌ ์ถ๋ ฅํ๊ธฐ
- ์ธ๊ตญ์ธ ์ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํ๊ธฐ
- ๊ณ ๋ น์ ๋น์จ ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๊ธฐ
๐ ๋ฐ์ดํํ๋ ์ ํ์ํ ํต๊ณ๋ด๊ธฐ
- ์ธ๊ตฌ์๊ฐ ๊ฐ์ฅ ๋ง์ ์์น๊ตฌ์ ์ธ๊ตฌ์ ์ต๋๊ฐ ๊ตฌํ๊ธฐ
- ์ธ๊ตฌ์๊ฐ ๊ฐ์ฅ ์ ์ ์์น๊ตฌ์ ์ธ๊ตฌ์ ์ต์๊ฐ ๊ตฌํ๊ธฐ
- ์ธ๊ตฌ์์ ๊ณ ๋ น์์ ๊ฐ์ ์๊ด ๊ด๊ณ ๊ตฌํ๊ธฐ