Python/Python Language

Pandas(ํŒ๋‹ค์Šค) 1์ฐจ์› 2์ฐจ์› ์ƒ์„ฑ๊ณผ ๋ฐ์ดํ„ฐ ์ •๋ฆฌ

567Rabbit 2024. 4. 5. 18:00
  • Pandas [Panel Data + Python Data Analysis]
  • NumPy and Matplotlib๋ฅผ ํ†ตํ•ฉํ•œ ๊ฒƒ์ด๋‹ค
  • ๋ฐ์ดํ„ฐ์…‹๋“ค์„ merge(๋ณ‘ํ•ฉ) ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค 
  • ๊ธฐ๋ณธ์ ์ธ ํ†ต๊ณ„๋ฐ์ดํ„ฐ ์ œ๊ณต
  • NaN values ๋ฅผ ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค
  • ์ˆซ์ž ๋ฌธ์ž์—ด์„ ์•Œ์•„์„œ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค
  • ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค
  • ์ง€์ €๋ถ„ํ•œ ๋ฐ์ดํ„ฐ์„ธํŠธ๋ฅผ ์ •๋ฆฌํ•˜์—ฌ ์ฝ๊ธฐ ์‰ฝ๊ณ  ๊ด€๋ จ์„ฑ์žˆ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค
  • ๊ณ ๊ธ‰ => ์ƒ๊ด€๊ด€๊ณ„, ํ”Œ๋กœํŒ…

 

 

์„ค์น˜ pip install pandas

 

ํŒ๋‹ค์Šค์˜ 1์ฐจ์› ๋ฐ์ดํ„ฐ๋ฅผ => ์‹œ๋ฆฌ์ฆˆ(Serise)๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค

ํŒ๋‹ค์Šค์˜ 2์ฐจ์› ๋ฐ์ดํ„ฐ๋ฅผ = > ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„(DataFrame)์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค

 

 

1์ฐจ์› ๋ฐ์ดํ„ฐ : ์‹œ๋ฆฌ์ฆˆ (Serise)

 

x = pd.Series(data = data, index = index)

eggs       30
apples      6
milk      Yes
bread      No
dtype: object

 

x.values

array([30, 6, 'Yes', 'No'], dtype=object)

 

x.index

Index(['eggs', 'apples', 'milk', 'bread'], dtype='object')

 

x.ndim #์ฐจ์› ์•Œ์•„๋ณด๊ธฐ

1

 

 

x[['eggs','bread']] #๋‘ ๊ฐœ ์ด์ƒ์˜ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ฌ ๋•Œ(accessํ•  ๋•Œ)๋Š” []๋ฌถ์Œ์ฒ˜๋ฆฌํ•œ๋‹ค

eggs     30
bread    No
dtype: object

 

 

x[1:3+1] #์Šฌ๋ผ์ด์‹ฑ

apples      6
milk      Yes
bread      No
dtype: object

 

x['apples' : 'bread'] #์Šฌ๋ผ์ด์‹ฑ

apples      6
milk      Yes
bread      No
dtype: object

 

 

2์ฐจ์› ๋ฐ์ดํ„ฐ : ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„(DataFrame)


ํŒ๋‹ค์Šค์˜ 2์ฐจ์› ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์œผ๋กœ ํ•œ๋‹ค. (DataFrame)
์‹ค์ œ ๋ฐ์ดํ„ฐ ๋ถ„์„์—์„œ๋Š” csv ํŒŒ์ผ์„ ํŒ๋‹ค์Šค์˜ ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์œผ๋กœ ์ฝ์–ด์™€์„œ ์ž‘์—…ํ•œ๋‹ค

 

df.describe()

: count , mean, std, min, max ๋“ฑ์˜ ์ •๋ณด๋ฅผ ์•Œ๋ ค์ค€๋‹ค

 

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'])}

  Bob Alice
bike 245.0 500.0
book NaN 40.0
glasses NaN 110.0
pants 25.0 45.0
watch 55.0 NaN

 

์™ผ์ชฝ์˜ ์ง„ํ•œ๊ธ€์”จ : index 
์œ„์ชฝ์˜ ์ง„ํ•œ ๊ธ€์”จ : coulmns
์•ˆ์ชฝ์— ์œ„์น˜ํ•œ ๋ฐ์ดํ„ฐ : values

 

 

์ƒˆ๋กœ์šด Column ์ƒ์„ฑํ•˜๊ธฐ, ์ปฌ๋Ÿผ๋ช… ๋ณ€๊ฒฝํ•˜๊ธฐ

 

# ์ƒˆ๋กœ์šด ์ปฌ๋Ÿผ name์„ ๋งŒ๋“ค๋˜, ๋ฐ์ดํ„ฐ๋Š” A,B,C๋ผ๊ณ  ๋„ฃ์ž.

  bike pants shirts suits
store 1 20 30 15.0 45.0
store 2 15 5 2.0 7.0
store 3 20 30 NaN NaN

 

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

df

  bike pants shirts suits name
store 1 20 30 15.0 45.0 A
store 2 15 5 2.0 7.0 B
store 3 20 30 NaN NaN C

 

 

 

# ์ปฌ๋Ÿผ๋ช… ๋ณ€๊ฒฝ. bikes => hat, suits => shoes

  bike pants shirts suits
store 1 20 30 15.0 45.0
store 2 15 5 2.0 7.0
store 3 20 30 NaN NaN

 

 

df.rename ( columns= { 'bikes' : 'hat' , 'suits' : 'shoes' } ,inplace = True)

  hat pants shirts shoes
store 1 20 30 15.0 45.0
store 2 15 5 2.0 7.0
store 3 20 30 NaN NaN

 

 

 

 

๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ (Access)

 

"๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„"์—์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ access ํ•˜๋Š” ๋ฐฉ๋ฒ•
# 1. ์ปฌ๋Ÿผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ• : ๋ณ€์ˆ˜๋ช… ๋ฐ”๋กœ ์˜ค๋ฅธ์ชฝ์— ๋Œ€๊ด„ํ˜ธ ์‚ฌ์šฉ!
# 2. ํ–‰๊ณผ ์—ด์˜ ์ •๋ณด๋กœ, ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ• (1)   .loc[ , ]๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ• - ์ด ๋ฐฉ๋ฒ•์€ ์‚ฌ๋žŒ์šฉ์ธ ์ธ๋ฑ์Šค์™€ ์ปฌ๋Ÿผ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ accessํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค
# 3. ํ–‰๊ณผ ์—ด์˜ ์ •๋ณด๋กœ, ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•(2)  .iloc[ , ]๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ• - ์ปดํ“จํ„ฐ๊ฐ€ ๋งค๊ธฐ๋Š” ์ธ๋ฑ์Šค(offset)๋กœ ๋ฐ์ดํ„ฐ๋ฅผ accessํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค

 

  bikes  pants  watches glasses 
store 1 20 30 35 NaN
store 2 15 5 10 50.0

 

 

df['watches']

store 1    35
store 2    10
Name: watches, dtype: int64

 

 

 

#๋ฐ”์ดํฌ๋ž‘ ์™€์น˜ ์ปฌ๋Ÿผ ๋‘๊ฐœ๋ฅผ ํ•œ๋ฒˆ์— ๊ฐ€์ ธ์˜ค์‹œ์˜ค

df[['bikes','watches']]  #๋‘ ๊ฐœ ์ด์ƒ์˜ ๋ฐ์ดํ„ฐ๋Š” [ , ]๋กœ ๋ฌถ์–ด์ค˜์•ผ ํ•œ๋‹ค

 

  bikes  watches
store 1 20 35
store 2 15 10

 

 

# ์Šคํ† ์–ด 1์˜ ํŒฌ์ธ  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค์‹œ์˜ค

df.loc['store 1','pants']

30

 

 

# ์Šคํ† ์–ด 2์˜ ๋ฐ”์ดํฌ, ํŒฌ์ธ  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค์‹œ์˜ค

df.loc['store 2',['bikes','watches']]

bikes      15.0
watches    10.0
Name: store 2, dtype: float64

 

 

# ์Šคํ† ์–ด 2์—์„œ, pants๋ถ€ํ„ฐ glasses๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค์‹œ์˜ค

df.loc['store 2','pants':'glasses']

pants       5.0
watches    10.0
glasses    50.0
Name: store 2, dtype: float64

 

 

# ์Šคํ† ์–ด 1์—์„œ pants ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค์‹œ์˜ค

df.iloc [ 0, 1 ]

30

 

 

# ์Šคํ† ์–ด 2์˜ bikes์™€ watches ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค์‹œ์˜ค

df.iloc[ 1 , [0,2] ]

bikes      15.0
watches    10.0
Name: store 2, dtype: float64

 

 

๋ฐ์ดํ„ฐ์ •๋ฆฌ

 

:  ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค

=>๋นˆ ์…€ ์ฒญ์†Œ, ์ž˜๋ชป๋œ ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ ์ •๋ฆฌ, ์˜ค๋ฅ˜ ๋ฐ์ดํ„ฐ ์ •๋ฆฌ(๋˜๋Š” ๋ฐ์ดํ„ฐ ๊ฐ’ ๋ณ€๊ฒฝ), ์ค‘๋ณต์ œ๊ฑฐ(drop_duplicates)

 

 

(1) ๋นˆ ์…€ ์ฒญ์†Œ

 

: ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ• ๋•Œ ๋นˆ ์…€์€ ์ž ์žฌ์ ์œผ๋กœ ์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค

 

๊ณต๋ฐฑ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ

df.isna().sum()       #์ปฌ๋Ÿผ๋ณ„๋กœ nan๊ฐœ์ˆ˜๊ฐ€ ๋”ํ•ด์ง„๋‹ค

df.isna().sum().sum()     #์ „์ฒด nan๊ฐœ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด์ค€๋‹ค

 

 

๋นˆ ์…€์ด ํฌํ•จ๋œ ํ–‰์„ ์ œ๊ฑฐ :    df.dropna() : nan์ด ๋“ค์–ด๊ฐ€์žˆ๋Š” ํ–‰์„ ์‚ญ์ œํ•ด์ค€๋‹ค

๋นˆ ์…€์„ ์ฑ„์šฐ๊ธฐ :               df.fillna(0)  : 0์œผ๋กœ ์ฑ„์šฐ๊ธฐ

                                       df.fillna("a") : ๋ฌธ์ž์—ด(a)๋กœ ์ฑ„์šฐ๊ธฐ

  bikes   pants   watches  shirts    shoes   suits  glassess
store 1 20 30 35 15.0 8 45.0 NaN
store 2       15 5 10 2.0 5 7.0 50.0
store 3 20 30 35 NaN 10 NaN 4.0

 

 

# nan์ด ๋“ค์–ด๊ฐ„ ํ–‰์„ ์‚ญ์ œ

df.dropna()

  bikes   pants   watches  shirts    shoes   suits  glassess
store 2   15   5            10       2.0       5    7.0    50.0

 

 

 

# 0์œผ๋กœ ์ฑ„์šฐ๊ธฐ

df.fillna(0)

  bikes   pants   watches  shirts    shoes   suits  glassess
store 1         20    30         35   15.0             8        45.0     0.0
store 2         15     5      10                2.0             5     7.0    50.0
store 3         20    30      35                0.0            10    0.0    4.0

 

 

 

# ํ‰๊ท ๊ฐ’์œผ๋กœ ์ฑ„์šฐ๊ธฐ

df.fillna(df.mean())

  bikes   pants   watches  shirts    shoes         suits  glassess
store 1         20           30                 35             15.0             8                 45.0                 27.0
store 2         15             5                 10               2.0             5                   7.0                 50.0
store 3         20           30                 35               8.5            10                 26.0                  4.0

 

 

 

#numeric_only=True๋Š” ์ˆซ์ž๋ฐ์ดํ„ฐ์˜ ๊ฐ’๋งŒ ๊ณ„์‚ฐํ•œ๋‹ค

  Book Title Author User1 User2 User3 User4
0 Great Expectations Charles Dickens 3.2 5.0 2.0 4.0
1 Of Mice and Men 
John Steinbeck NaN 1.3 2.3 3.5
2 Romeo and Juliet William Shakespeare  2.5 4.0 NaN 4.0
3 The Time Machine H. G. Wells NaN 3.8 4.0 5.0
4 Alice in Wonderland Lewis Carroll NaN NaN NaN 4.2

 

 

df.fillna(df.mean(numeric_only=True)) 

  Book Title Author User1 User2 User3 User4
0 Great Expectations Charles Dickens 3.2 5.0 2.0 4.0
1 Of Mice and Men
John Steinbeck 2.85 1.3 2.3 3.5
2 Romeo and Juliet William Shakespeare 2.5 4.0 2.766667 4.0
3 The Time Machine H. G. Wells 2.85 3.8 4.0 5.0
4 Alice in Wonderland Lewis Carroll 2.85 3.525 2.766667 4.2

 

 

 

(2) ์ž˜๋ชป๋œ ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ ์ •๋ฆฌ

- ๋ฐ์ดํ„ฐ์˜ ํ˜•์‹์„ ์•Œ๋งž๊ฒŒ ๋ฐ”๊ฟ”์ค€๋‹ค

 

 


(3) ๋ฐ์ดํ„ฐ ์˜ค๋ฅ˜ ์ •๋ฆฌ ๋˜๋Š” ๋ฐ์ดํ„ฐ ๊ฐ’ ๋ณ€๊ฒฝํ•˜๊ธฐ

Replacing Values
Removing Rows

 

# ์Šคํ† ์–ด 2์˜ watches ๋ฐ์ดํ„ฐ๋ฅผ, 20์œผ๋กœ ๋ณ€๊ฒฝํ•ด ์ฃผ์„ธ์š”

  bikes  pants  watches glasses 
store 1 20 30 35 NaN
store 2 15 5 10 50.0

 

df.loc['store 2','watches'] = 20

df

  bikes  pants  watches glasses 
store 1 20 30 35 NaN
store 2 15 5 20 50.0

 

-----------------------------------------------------------------------------------------------------------------------------------

๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ฆฌํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, null ์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ accessํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด

.notna๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค

 

null์ธ์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด

.isna()

 

์—ด๋ณ„๋กœ null์˜ ๊ฐœ์ˆ˜๋ฅผ ํ™•์ธํ•˜๊ณ ์‹ถ๋‹ค๋ฉด

.isna().sum()

 

์ด null์˜ ๊ฐœ์ˆ˜๋ฅผ ํ™•์ธํ•˜๊ณ ์‹ถ๋‹ค๋ฉด

.isna().sum().sum()

--------------------------------------------------------------------------------------------------------------------------------------

 

# ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•
- ํ–‰ ์‚ญ์ œ, ์—ด ์‚ญ์ œ
- drop()ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๊ณ , axis๋งŒ ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค

 

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

  bikes  pants  glasses 
store 1 20 30 NaN
store 2 15 5 50.0

 

df.drop('store 2' , axis=0)

  bikes  pants  watches glasses 
store 1 20 30 35 NaN

 


(4) ์ค‘๋ณต ์ œ๊ฑฐ
(drop_duplicates)

 

                 Year             Name        Department          Age            Salary
0              1990               Alice                HR                25               50000
1              1990               Bob                 RD                30                48000
2              1990              Charlie             Admin           45                55000
3              1991               Alice               HR                 26                52000
4              1991               Bob                 RD                31                50000
5              1991               Charlie            Admin           46                60000
6              1992               Alice               HR                 27                60000
7              1992               Bob                RD                 32                52000
8              1992               Charlie           Admin            47                62000

 

 

< ์นดํ…Œ๊ณ ๋ฆฌ์ปฌ ๋ฐ์ดํ„ฐ (Categorical Data) >

-์ค‘๋ณต์ด ๋ฐœ์ƒํ•˜๋Š” ๋ฐ์ดํ„ฐ
-์œ ๋‹ˆํฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•ด์•ผํ•œ๋‹ค
-์นดํ…Œ๊ณ ๋ฆฌ์ปฌ ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ ๋ถ„์„์‹œ ๋ฐ์ดํ„ฐ๋ณ„๋กœ ๋ฌถ์–ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋‹ค

 

df4['Department'].unique()

array(['HR', 'RD', 'Admin'], dtype=object)

 

df4['Year'].unique()

array([1990, 1991, 1992], dtype=int64)

 

df4['Year'].nunique()

3

 

 

 

๋ฐ์ดํ„ฐ ๋ฌถ์–ด์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ  .groupby()

 

- ๊ฐ ๋…„๋„๋ณ„๋กœ, ์ง€๊ธ‰ํ•œ ์—ฐ๋ด‰ ์ดํ•ฉ์„ ๊ตฌํ•˜๋ผ.

df4.groupby('Year')['Salary'].sum()

Year
1990    153000
1991    162000
1992    174000
Name: Salary, dtype: int64

 

* df4.groupby('Year')['Salary'].count()ํ•˜๋ฉด, ๋ฐ์ดํ„ฐ๊ฐ€ ๋ช‡ ๊ฐœ์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

 

๋ช‡ ๊ฐœ๊ฐ€ ์ค‘๋ณต๋˜์—ˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ

 

# Name ์ปฌ๋Ÿผ์€, ๊ฐ ์ด๋ฆ„๋ณ„๋กœ ๋ช‡๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„๊นŒ?

df4.groupby('Name')['Name'].count()

Name
Alice      3
Bob        3
Charlie    3
Name: Name, dtype: int64

 

df4['Name'].value_counts

Name
Alice      3
Bob        3
Charlie    3
Name: count, dtype: int64