๊ด€๋ฆฌ ๋ฉ”๋‰ด

ruriruriya

[Python] ํŒŒ์ด์ฌ ํŒ๋‹ค์Šค(Pandas) - 2์ฐจ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ, ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„(DataFrame)๊ณผ ๋ฐ์ดํ„ฐ ์•ก์„œ์Šค ๋ณธ๋ฌธ

๐ŸPython/Pandas

[Python] ํŒŒ์ด์ฌ ํŒ๋‹ค์Šค(Pandas) - 2์ฐจ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ, ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„(DataFrame)๊ณผ ๋ฐ์ดํ„ฐ ์•ก์„œ์Šค

๋ฃจ๋ฆฌ์•ผใ…‘ 2023. 11. 14. 21:43
๋ฐ˜์‘ํ˜•

 

์‚ฌ์ง„: Unsplash ์˜ Pascal Müller

ํŒ๋‹ค์Šค ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„(Pandas DataFrame)์ด๋ž€?

๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„(DataFrame)์€ ํŒ๋‹ค์Šค์˜ ํ•ต์‹ฌ ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ํ•˜๋‚˜๋กœ,
ํ…Œ์ด๋ธ” ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์€ ํ–‰๊ณผ ์—ด๋กœ ๊ตฌ์„ฑ๋œ 2์ฐจ์› ํ…Œ์ด๋ธ”๋กœ,
๊ฐ ์—ด์€ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ์กฐ์ž‘ํ•˜๊ณ  ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์€ CSV, Excel, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ ๋‹ค์–‘ํ•œ ์†Œ์Šค๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŒ๋‹ค์Šค์˜ ๋‹ค์–‘ํ•œ ํ•จ์ˆ˜์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ
๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์„ ์กฐ์ž‘ํ•˜๊ณ  ํ•„ํ„ฐ๋งํ•˜๋ฉฐ, ๋ถ„์„ ๋ฐ ์‹œ๊ฐํ™”๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ํŒ๋‹ค์Šค ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ ์ƒ์„ฑํ•˜๊ธฐ

๋จผ์ € ํŒŒ์ด์ฌ์˜ dict๋ฅผ ํŒ๋‹ค์Šค 1์ฐจ์› ๋ฐ์ดํ„ฐ Series ์‚ฌ์šฉํ•ด 2์ฐจ์› ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•œ๋‹ค.

import pandas as pd

items = {'Bob' : pd.Series(data = [245, 25, 55], index = ['bike', 'pants', 'watch']),
         'Alice' : pd.Series(data = [40, 110, 500, 45], index = ['book', 'glasses', 'bike', 'pants'])}

df ๋ณ€์ˆ˜์— ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ ์†์„ฑ์˜ data ๊ฐ’์— items ๋ณ€์ˆ˜๋ฅผ ํ• ๋‹นํ•˜์—ฌ ์ถœ๋ ฅํ•˜๋ฉด
์—‘์…€๊ณผ ๋น„์Šทํ•œ ํ‘œ๊ฐ€ ๋ณด๊ธฐ ์ข‹์€ ํ”„๋ ˆ์ž„ ํ˜•ํƒœ๋กœ ์ถœ๋ ฅ๋œ๋‹ค.

๊ตฌ๊ธ€ ์ฝ”๋žฉ์—์„œ ์‹คํ–‰

๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„๋„ ๋ชจ์–‘๊ณผ, ์ฐจ์›, ์‚ฌ์ด์ฆˆ ๋“ฑ ์–ด๋–ป๊ฒŒ ๋‚˜์˜ค๋Š” ์ง€ ์‚ดํŽด๋ณด์ž

>> df.shape
(5, 2)	#5ํ–‰ 2์—ด
>> df.ndim
2	# 2์ฐจ์› ๋ฐ์ดํ„ฐ
>> df.size
10	# ์ „์ฒด ์š”์†Œ(์…€ ๊ฐœ์ˆ˜ ๋ฐ˜ํ™˜)
>> df.index
Index(['bike', 'book', 'glasses', 'pants', 'watch'], dtype='object')
>> df.columns
Index(['Bob', 'Alice'], dtype='object')
>> df.values	#nan : ์•„๋ฌด ๋ฐ์ดํ„ฐ๋„ ์—†์Œ
array([[245., 500.],
       [ nan,  40.],
       [ nan, 110.],
       [ 25.,  45.],
       [ 55.,  nan]])

 

ํŒ๋‹ค์Šค ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์˜ ์š”์†Œ์— ์•ก์„ธ์Šคํ•˜๊ธฐ

ํŒ๋‹ค์Šค์—์„œ๋Š” 2์ฐจ์› ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์—์„œ ์•ก์„ธ์Šคํ•˜๋Š” 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.
์ด ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด์ž.

1. ์ปฌ๋Ÿผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ• : ๋ณ€์ˆ˜๋ช… ์˜ค๋ฅธ์ชฝ์—์„œ ๋Œ€๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉ. 
2. ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์ปฌ๋Ÿผ๋ช…์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์•ก์„ธ์Šค
3. ์ปดํ“จํ„ฐ๊ฐ€ ์ฝ๊ธฐ ์ข‹์€ ์ธ๋ฑ์Šค๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•

์šฐ์„  dict๋ฅผ ์ด์šฉํ•ด 2์ฐจ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ ๋‹ค.

import pandas as pd

>> items2 = [{'bikes': 20, 'pants': 30, 'watches': 35},
          {'watches': 10, 'glasses': 50, 'bikes': 15, 'pants':5}]
          
>> df = pd.DataFrame(data = items2, index = ['store1','store2'])
>> df

df ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜์—ฌ ์ถœ๋ ฅํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜์˜จ๋‹ค. ์•„๋ž˜ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ 2์ฐจ ๋ฐ์ดํ„ฐ๋ฅผ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์•ก์„ธ์Šค ํ•ด๋ณด์ž.

๊ตฌ๊ธ€์ฝ”๋žฉ์—์„œ ์‹คํ–‰

1. ๋ณ€์ˆ˜ ์˜ค๋ฅธ์ชฝ ๋Œ€๊ด„ํ˜ธ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค

bike ์—ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ๊ฐ€์ ธ์˜จ๋‹ค.

>> df['bikes']
store1    20
store2    15
Name: bikes, dtype: int64

bike ์—ด๊ณผ watches ์—ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ๊ฐ€์ ธ์˜จ๋‹ค.

>> df[ ['bikes', 'watches'] ]

๊ตฌ๊ธ€์ฝ”๋žฉ์—์„œ ์‹คํ–‰

2. ์‚ฌ๋žŒ์ด ๋ณด๊ธฐ ํŽธํ•œ ์ธ๋ฑ์Šค์™€ ์ปฌ๋Ÿผ๋ช…์œผ๋กœ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค

# ๋ณ€์ˆ˜๋ช….loc[ , ]

store 1์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

>> df.loc[ 'store1', ]
bikes      20.0
pants      30.0
watches    35.0
glasses     NaN
Name: store1, dtype: float64
>> df.loc[ 'store1', :  ]
# ์ฝœ๋ก (:) ์•ž์„ ๋น„์šฐ๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ ์œ„์น˜๊นŒ์ง€, ๋’ค๋ฅผ ๋น„์šฐ๋ฉด ์‹œ์ž‘์œ„์น˜๋ถ€ํ„ฐ ๋๊นŒ์ง€, ๋‘˜๋‹ค ๋น„์šฐ๋ฉด ์ „๋ถ€
bikes      20.0
pants      30.0
watches    35.0
glasses     NaN
Name: store1, dtype: float64

store 1์˜ pants ์—ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

>> df.loc['store1' , 'pants']
30
>> df['pants']['store1']
30

store 1์˜  bikes์™€ watches์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

>> df.loc['Store 1',['bikes','watches']]
bikes      20.0
watches    35.0
Name: Store 1, dtype: float64

store 1dml pants์™€ glasses์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

>> df.loc['Store 2','pants':]
pants       5.0
watches    10.0
glasses    50.0
Name: Store 2, dtype: float64

 

3. ์ปดํ“จํ„ฐ๊ฐ€ ๋ณด๊ธฐ ํŽธํ•œ ์ธ๋ฑ์Šค๋กœ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค

# ๋ณ€์ˆ˜๋ช….iloc[ , ]

store 1์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

>> df.iloc[0]
bikes      20.0
pants      30.0
watches    35.0
glasses     NaN
Name: Store 1, dtype: float64

store 1์˜ bikes๋ถ€ํ„ฐ pants๊นŒ์ง€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

>> df.iloc[0,:2]
bikes    20.0
pants    30.0
Name: Store 1, dtype: float64

store 1์˜ pants ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

>> df.iloc[0,1]
30

store 1์˜ bikes์™€ watches์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

>> df.iloc[0,[0,2]]
bikes      20.0
watches    35.0
Name: Store 1, dtype: float64

store 1์˜ pants๋ถ€ํ„ฐ glasses์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

>> df.iloc[0,1:]
pants      30.0
watches    35.0
glasses     NaN
Name: Store 1, dtype: float64

store 1์˜ pants๋ถ€ํ„ฐ watches์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

>> df.iloc[0, 1:3] # ๋ ์œ„์น˜ ์ธ๋ฑ์Šค๋Š” ํ•ญ์ƒ +1
pants      30.0
watches    35.0
Name: Store 1, dtype: float64

>> df.loc['Store 1','pants':'watches'] #์—ด์˜ ์ด๋ฆ„, ์ปฌ๋Ÿผ๋ช…์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ๋Š” ๋˜‘๊ฐ™์ด
pants      30.0
watches    35.0
Name: Store 1, dtype: float64

 

๋ฐ์ดํ„ฐ์˜ ๊ฐ’ ๋ณ€๊ฒฝ, ์ถ”๊ฐ€, ์‚ญ์ œ

์•„๋ž˜ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์—์„œ ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ณ , ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•˜๊ณ , ์‚ญ์ œํ•ด๋ณด์ž.

๊ตฌ๊ธ€์ฝ”๋žฉ์œผ๋กœ ์‹คํ–‰

๋ฐ์ดํ„ฐ์˜ ๊ฐ’ ๋ณ€๊ฒฝํ•˜๊ธฐ

store 2์˜ watches์˜ ๊ฐœ์ˆ˜ 20์œผ๋กœ ๋ณ€๊ฒฝ

>> df.iloc[1,2] = 20
>> df.iloc[1,2]
20

 

๋ฐ์ดํ„ฐ์˜ ์ƒˆ๋กœ์šด ์ปฌ๋Ÿผ ๋งŒ๋“ค๊ธฐ

shirts๋ผ๋Š” ์ปฌ๋Ÿผ์„ ๋งŒ๋“ค๋˜, Store 1์—๋Š” 15 Store 2์—๋Š” 2๋กœ ์ €์žฅํ•œ๋‹ค.

>> df['shirts']=[15,2]
>> df['shirts']
Store 1    15
Store 2     2
Name: shirts, dtype: int64

suits๋ผ๋Š” ์ปฌ๋Ÿผ์„ ๋งŒ๋“ค๋˜, pants์˜ ์ˆ˜์™€ shirts์˜ ์ˆ˜๋ฅผ ๋”ํ•ด์„œ ๋งŒ๋“ค๊ธฐ

>> df['suits']=df['pants']+df['shirts']
>> df['suits']
Store 1    45
Store 2     7
Name: suits, dtype: int64

๋ณ€๊ฒฝ๊ณผ ์ƒˆ๋กœ์šด ์ปฌ๋Ÿผ ์ถ”๊ฐ€๊นŒ์ง€์˜ ๊ฒฐ๊ณผ

ํ–‰์‚ญ์ œ, ์—ด์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•

Store 1์„ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•(ํ–‰์‚ญ์ œ)

>> df.drop('Store 1', axis= 0)

๊ตฌ๊ธ€์ฝ”๋žฉ์—์„œ ์‹คํ–‰

watches ์ปฌ๋Ÿผ ์‚ญ์ œ(์—ด์‚ญ์ œ)

>> df.drop('watches', axis=1)

๊ตฌ๊ธ€์ฝ”๋žฉ์—์„œ ์‹คํ–‰

bikes, glasses, suits ์ปฌ๋Ÿผ์„ ์‚ญ์ œํ•˜์‹œ์˜ค.

df.drop(['bikes','glasses','suits'], axis=1)

๊ตฌ๊ธ€์ฝ”๋žฉ์—์„œ ์‹คํ–‰

์ธ๋ฑ์Šค๋‚˜ ์ปฌ๋Ÿผ๋ช…์„ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•

store 2๋ฅผ last store๋กœ ์ธ๋ฑ์Šค ๋ณ€๊ฒฝ

>> df.rename(index={'store2':'last store'})

๊ตฌ๊ธ€์ฝ”๋žฉ์—์„œ ์‹คํ–‰

bikes๋ฅผ hats์œผ๋กœ ์ปฌ๋Ÿผ๋ช… ๋ณ€๊ฒฝ

>> df.rename(columns = {'bikes':'hats'})

๊ตฌ๊ธ€์ฝ”๋žฉ์—์„œ ์‹คํ–‰

 

์ปฌ๋Ÿผ์„ ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

๊ฐ€๊ฒŒ์ด๋ฆ„์„ A,B๋ผ๊ณ  ํ•˜์—ฌ, ์ƒˆ๋กœ์šด ์ปฌ๋Ÿผ name ์ปฌ๋Ÿผ ์ƒ์„ฑ

>> df['name']= ['A','B']
>> df

์ƒˆ๋กœ ์ƒ์„ฑ๋œ name ์ปฌ๋Ÿผ์„ ์ธ๋ฑ์Šค๋กœ ๋ณ€๊ฒฝ

>> df.set_index('name')

์ธ๋ฑ์Šค๋กœ ๋ณ€๊ฒฝ๋œ name์ปฌ๋Ÿผ์„ ๋‹ค์‹œ ๋˜๋Œ๋ฆฌ๊ธฐ

์ด๋•Œ ๋งจ ์•ž์œผ๋กœ ์ปฌ๋Ÿผ์ด ๋ฐฐ์น˜๋œ๋‹ค.

>> df.reset_index()

๊ทธ๋Ÿผ ์›ํ•˜๋Š” ์ปฌ๋Ÿผ ๋ฐฐ์น˜๋ฅผ ํ•˜๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•˜๋ฉด ๋œ๋‹ค.

>> df = df[['watches','shirts','bikes','pants','suits','suits']]
>> df

๋ฐ˜์‘ํ˜•