๐Ÿ•“

Pandas

notion imagenotion image

๋ชฉ์ฐจ

ย 

Pandas

  • ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•  ๋•Œ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค.
  • ํ–‰๊ณผ ์—ด์„ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋„๊ตฌ์ด๋‹ค.
    • โ€ป ๊ฐ ์—ด์€ ๋‹จ์ผ ๋ฐ์ดํ„ฐ ํ˜•์‹๋งŒ ์ €์žฅ
  • numpy๋ณด๋‹ค ์œ ์—ฐํ•˜๊ฒŒ ์ˆ˜์น˜ ์—ฐ์‚ฐ ๊ฐ€๋Šฅํ•˜๋‹ค.
ย 
import pandas as pd pd.__version__ pd? # tab ๋ˆ„๋ฅด๋ฉด ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ method๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
Out[-] 1.0.1

Series

  • index์™€ values๋กœ ์ด๋ฃจ์–ด์ง„ 1์ฐจ์› ๋ฐฐ์—ด์ด๋‹ค.
  • ๋ชจ๋“  ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ธ๋ฑ์Šค๋ฅผ ์ง€์ •ํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.
  • ์ธ๋ฑ์Šค ๊ธธ์ด๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ธธ์ด์™€ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.
  • ๋ช…์‹œ์  ์ธ๋ฑ์Šค์™€ ์•”๋ฌต์  ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€์ง„๋‹ค.
    • loc : ์ธ๋ฑ์Šค๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ–‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š”๋‹ค.
    • iloc : ์ •์ˆ˜ ์ธ๋ฑ์Šค์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ–‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š”๋‹ค.
import pandas as pd import numpy as np
data = np.arange(0, 50, 10) data
Out[-] array([ 0, 10, 20, 30, 40])
a = pd.Series(data, index=['a', 'b', 'c', 'd', 'e']) print(a)
Out[-] a 0 b 10 c 20 d 30 e 40 dtype: int32
b = pd.Series(data) b
Out[-] 0 0 1 10 2 20 3 30 4 40 dtype: int32
a['b']
Out[-] 10
a.loc['b']
Out[-] 10
a.iloc[1]
Out[-] 10
ย 

์‚ฐ์ˆ ์—ฐ์‚ฐ

a
Out[-] a 0 b 10 c 20 d 30 e 40 dtype: int32
# ๋”ํ•˜๊ธฐ a + 10
Out[-] a 10 b 20 c 30 d 40 e 50 dtype: int32
# ๋นผ๊ธฐ a - 10
Out[-] a -10 b 0 c 10 d 20 e 30 dtype: int32
# ๊ณฑํ•˜๊ธฐ a * 10
Out[-] a 0 b 100 c 200 d 300 e 400 dtype: int32
# ๊ฑฐ๋“ญ์ œ๊ณฑ a ** 2
Out[-] a 0 b 100 c 400 d 900 e 1600 dtype: int32
# ๋‚˜๋ˆ„๊ธฐ a / 5
Out[-] a 0.0 b 2.0 c 4.0 d 6.0 e 8.0 dtype: float64
# ๋ชซ a // 5
Out[-] a 0 b 2 c 4 d 6 e 8 dtype: int32
# ๋‚˜๋จธ์ง€ a % 3
Out[-] a 0 b 1 c 2 d 0 e 1 dtype: int32
ย 

๋น„๊ต ์—ฐ์‚ฐ์ž

a
Out[-] a 0 b 10 c 20 d 30 e 40 dtype: int32
a > 15
Out[-] a False b False c True d True e True dtype: bool
a[a>15]
Out[-] c 20 d 30 e 40 dtype: int32
ย 

์ง‘๊ณ„ํ•จ์ˆ˜

  • add : ๋”ํ•˜๊ธฐ ํ•จ์ˆ˜
  • sub : ๋นผ๊ธฐ ํ•จ์ˆ˜
  • mul : ๊ณฑํ•˜๊ธฐ ํ•จ์ˆ˜
  • div : ๋‚˜๋ˆ„๊ธฐ ํ•จ์ˆ˜
  • mod : ๋‚˜๋จธ์ง€ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
  • min : ์ตœ์†Œ๊ฐ’ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
  • max : ์ตœ๋Œ€๊ฐ’ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
  • mean : ํ‰๊ท  ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
  • median : ์ค‘์•™๊ฐ’ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
  • std : ํ‘œ์ค€ํŽธ์ฐจ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
  • var : ๋ถ„์‚ฐ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
a.add(100)
Out[-] a 100 b 101 c 102 d 103 e 104 dtype: int32
a.sub(100)
Out[-] a -100 b -90 c -80 d -70 e -60 dtype: int32
a.mul(100)
Out[-] a 0 b 1000 c 2000 d 3000 e 4000 dtype: int32
a.div(100)
Out[-] a 0.0 b 0.1 c 0.2 d 0.3 e 0.4 dtype: float64
a.mod(3)
Out[-] a 0 b 1 c 2 d 0 e 1 dtype: int32
a.min()
Out[-] 0
a.max()
Out[-] 40
a.sum()
Out[-] 100
a.mean()
Out[-] 20.0
a.median()
Out[-] 20.0
a.std()
Out[-] 15.811388300841896
a.var()
Out[-] 250.0
ย 

DataFrame

  • 2์ฐจ์› ๋ฐฐ์—ด์— ํ–‰๊ณผ ์—ด์— ์ธ๋ฑ์Šค๋ฅผ ๋ถ™์ธ ๊ฒƒ์ด๋‹ค.
  • ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ด๋‹ค.
# 50๋ถ€ํ„ฐ 100์‚ฌ์ด, 4x3ํ˜•ํƒœ๋กœ ๋žœ๋ค ์ƒ์„ฑ rawData = np.random.randint(50, 100, size=(4, 3)) rawData
Out[-] array([[72, 61, 98], [83, 90, 91], [55, 71, 89], [71, 71, 76]])
df = pd.DataFrame(rawData, index=['1๋ฐ˜', '2๋ฐ˜', '1๋ฐ˜', '2๋ฐ˜'], columns=['๊ตญ', '์˜', '์ˆ˜']) df
Out[-] ๊ตญ ์˜ ์ˆ˜ 1๋ฐ˜ 72 61 98 2๋ฐ˜ 83 90 91 1๋ฐ˜ 55 71 89 2๋ฐ˜ 71 71 76
#df[0] -> Error df['๊ตญ']
Out[-] 1๋ฐ˜ 72 2๋ฐ˜ 83 1๋ฐ˜ 55 2๋ฐ˜ 71 Name: ๊ตญ, dtype: int32
df
Out[-] ๊ตญ ์˜ ์ˆ˜ 1๋ฐ˜ 72 61 98 2๋ฐ˜ 83 90 91 1๋ฐ˜ 55 71 89 2๋ฐ˜ 71 71 76
# ์—ด์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํ‰๊ท  ๊ตฌํ•˜๊ธฐ df['ํ‰๊ท '] = round((df['๊ตญ']+df['์˜']+df['์ˆ˜'])/3, 2) df
Out[-] ๊ตญ ์˜ ์ˆ˜ ํ‰๊ท  1๋ฐ˜ 72 61 98 77.00 2๋ฐ˜ 83 90 91 88.00 1๋ฐ˜ 55 71 89 71.67 2๋ฐ˜ 71 71 76 72.67
# ์—ด('na') ์ถ”๊ฐ€ํ•˜๊ณ  NaN๊ฐ’์„ ๋„ฃ๊ธฐ df["na"] = np.nan df
Out[-] ๊ตญ ์˜ ์ˆ˜ ํ‰๊ท  na 1๋ฐ˜ 72 61 98 77.00 NaN 2๋ฐ˜ 83 90 91 88.00 NaN 1๋ฐ˜ 55 71 89 71.67 NaN 2๋ฐ˜ 71 71 76 72.67 NaN
# del ์‚ญ์ œ del df['na'] df
Out[-] ๊ตญ ์˜ ์ˆ˜ ํ‰๊ท  1๋ฐ˜ 72 61 98 77.00 2๋ฐ˜ 83 90 91 88.00 1๋ฐ˜ 55 71 89 71.67 2๋ฐ˜ 71 71 76 72.67
df[df.ํ‰๊ท  > 75]
Out[-] ๊ตญ ์˜ ์ˆ˜ ํ‰๊ท  1๋ฐ˜ 72 61 98 77.0 2๋ฐ˜ 83 90 91 88.0
df = df.drop(["ํ‰๊ท "], axis = 'columns') df
Out[-] ๊ตญ ์˜ ์ˆ˜ 1๋ฐ˜ 72 61 98 2๋ฐ˜ 83 90 91 1๋ฐ˜ 55 71 89 2๋ฐ˜ 71 71 76
ย 

๊ฒฐ์ธก๊ฐ’ ์ฒ˜๋ฆฌ

  1. NaN
      • ์ž๋ฃŒํ˜•์ด Floatํ˜•์ด๋‹ค.
      • ๋ฐฐ์—ด์—์„œ ์—ฐ์‚ฐํ•  ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์ง€๋งŒ ๊ฒฐ๊ณผ๊ฐ’์ด NaN์ด ๋œ๋‹ค.
  1. None
      • ์ž๋ฃŒํ˜•์ด None์ด๋‹ค.
      • ๋ฐฐ์—ด ์—ฐ์‚ฐ์„ ํ•  ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
3. ์ฒ˜๋ฆฌ๋ฐฉ๋ฒ•
  • isnull() : ๊ฒฐ์ธก๊ฐ’ ํ™•์ธ (๊ฒฐ์ธก ์ด๋ฉด True , ๊ฒฐ์ธก์ด ์•„๋‹ˆ๋ฉด False )
  • notnull() : ๊ฒฐ์ธก๊ฐ’ ํ™•์ธ (๊ฒฐ์ธก ์ด๋ฉด False , ๊ฒฐ์ธก์ด ์•„๋‹ˆ๋ฉด True )
  • dropna() : ๊ฒฐ์ธก๊ฐ’ ์‚ญ์ œ
    • inplace = True : dropํ›„ ์›๋ณธ์— ๋ฐ˜์˜
  • fillna(Num) : ๊ฒฐ์ธก๊ฐ’์„ Num์œผ๋กœ ์ฑ„์›Œ ๋„ฃ๋Š”๋‹ค.
df = df.astype('float64') # ํƒ€์ž… ๋ณ€๊ฒฝ df
Out[-] ๊ตญ ์˜ ์ˆ˜ 1๋ฐ˜ 72.0 61.0 98.0 2๋ฐ˜ 83.0 90.0 91.0 1๋ฐ˜ 55.0 71.0 89.0 2๋ฐ˜ 71.0 71.0 76.0
df['์ˆ˜'][2] = np.nan df
Out[-] ๊ตญ ์˜ ์ˆ˜ 1๋ฐ˜ 72.0 61.0 98.0 2๋ฐ˜ 83.0 90.0 91.0 1๋ฐ˜ 55.0 71.0 NaN 2๋ฐ˜ 71.0 71.0 76.0
df.dropna(axis=0) # inplace=True # axis=0 : ํ–‰ ์‚ญ์ œ
Out[-] ๊ตญ ์˜ ์ˆ˜ 1๋ฐ˜ 72.0 61.0 98.0 2๋ฐ˜ 83.0 90.0 91.0 2๋ฐ˜ 71.0 71.0 76.0
df
Out[-] ๊ตญ ์˜ ์ˆ˜ 1๋ฐ˜ 72.0 61.0 98.0 2๋ฐ˜ 83.0 90.0 91.0 1๋ฐ˜ 55.0 71.0 NaN 2๋ฐ˜ 71.0 71.0 76.0
df.dropna(axis=1) # axis=1 : ์—ด ์‚ญ์ œ
Out[-] ๊ตญ ์˜ 1๋ฐ˜ 72.0 61.0 2๋ฐ˜ 83.0 90.0 1๋ฐ˜ 55.0 71.0 2๋ฐ˜ 71.0 71.0
df.fillna('hello')
Out[-] ๊ตญ ์˜ ์ˆ˜ 1๋ฐ˜ 72.0 61.0 98 2๋ฐ˜ 83.0 90.0 91 1๋ฐ˜ 55.0 71.0 hello 2๋ฐ˜ 71.0 71.0 76
df.fillna(0) # 0์œผ๋กœ ๋Œ€์ฒด
Out[-] ๊ตญ ์˜ ์ˆ˜ 1๋ฐ˜ 72.0 61.0 98.0 2๋ฐ˜ 83.0 90.0 91.0 1๋ฐ˜ 55.0 71.0 0.0 2๋ฐ˜ 71.0 71.0 76.0
df.fillna(df.mean()) # ํ‰๊ท ์œผ๋กœ ๋Œ€์ฒด
Out[-] ๊ตญ ์˜ ์ˆ˜ 1๋ฐ˜ 72.0 61.0 98.000000 2๋ฐ˜ 83.0 90.0 91.000000 1๋ฐ˜ 55.0 71.0 88.333333 2๋ฐ˜ 71.0 71.0 76.000000
ย 

MultiIndex

  • Index๋ฅผ ์„ค์ •ํ•  ๋•Œ ๋ฆฌ์ŠคํŠธ์˜ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ๋„ฃ์–ด์ฃผ๋ฉด ๋‹ค์ค‘ ์ธ๋ฑ์Šค๊ฐ€ ์„ค์ •์ด ๋œ๋‹ค.
df
Out[-] ๊ตญ ์˜ ์ˆ˜ 1๋ฐ˜ 72.0 61.0 98.0 2๋ฐ˜ 83.0 90.0 91.0 1๋ฐ˜ 55.0 71.0 NaN 2๋ฐ˜ 71.0 71.0 76.0
# index ์™€ columns์„ ๋ฐ”๊ฟˆ df.T
Out[-] 1๋ฐ˜ 2๋ฐ˜ 1๋ฐ˜ 2๋ฐ˜ ๊ตญ 72.0 83.0 55.0 71.0 ์˜ 61.0 90.0 71.0 71.0 ์ˆ˜ 98.0 91.0 NaN 76.0
df
๊ตญ ์˜ ์ˆ˜ 1๋ฐ˜ 72.0 61.0 98.0 2๋ฐ˜ 83.0 90.0 91.0 1๋ฐ˜ 55.0 71.0 NaN 2๋ฐ˜ 71.0 71.0 76.0
df.index = [['1ํ•™๋…„', '1ํ•™๋…„', '2ํ•™๋…„', '2ํ•™๋…„'], ['1๋ฐ˜', '2๋ฐ˜', '1๋ฐ˜', '2๋ฐ˜']] df
Out[-] ๊ตญ ์˜ ์ˆ˜ 1ํ•™๋…„ 1๋ฐ˜ 72.0 61.0 98.0 2๋ฐ˜ 83.0 90.0 91.0 2ํ•™๋…„ 1๋ฐ˜ 55.0 71.0 NaN 2๋ฐ˜ 71.0 71.0 76.0
df.columns = [['์–ธ์–ด', '์–ธ์–ด', '์ˆ˜๋ฆฌ'],['๊ตญ', '์˜', '์ˆ˜']] df
Out[-] ์–ธ์–ด ์ˆ˜๋ฆฌ ๊ตญ ์˜ ์ˆ˜ 1ํ•™๋…„ 1๋ฐ˜ 72.0 61.0 98.0 2๋ฐ˜ 83.0 90.0 91.0 2ํ•™๋…„ 1๋ฐ˜ 55.0 71.0 NaN 2๋ฐ˜ 71.0 71.0 76.0
df['์–ธ์–ด']['๊ตญ']
Out[-] 1ํ•™๋…„ 1๋ฐ˜ 72.0 2๋ฐ˜ 83.0 2ํ•™๋…„ 1๋ฐ˜ 55.0 2๋ฐ˜ 71.0 Name: ๊ตญ, dtype: float64
df.iloc[0]
Out[-] ์–ธ์–ด ๊ตญ 72.0 ์˜ 61.0 ์ˆ˜๋ฆฌ ์ˆ˜ 98.0 Name: (1ํ•™๋…„, 1๋ฐ˜), dtype: float64
df.loc['1ํ•™๋…„']
Out[-] ์–ธ์–ด ์ˆ˜๋ฆฌ ๊ตญ ์˜ ์ˆ˜ 1๋ฐ˜ 72.0 61.0 98.0 2๋ฐ˜ 83.0 90.0 91.0
df.loc['1ํ•™๋…„'].loc['1๋ฐ˜']
Out[-] ์–ธ์–ด ๊ตญ 72.0 ์˜ 61.0 ์ˆ˜๋ฆฌ ์ˆ˜ 98.0 Name: 1๋ฐ˜, dtype: float64
ย 

๋ฐ์ดํ„ฐ ์‚ฌ์ „ ๋ถ„์„

  • info() : DataFrame์„ ๊ตฌ์„ฑํ•˜๋Š” ํ–‰๊ณผ ์—ด์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด ์ฃผ๋Š” ํ•จ์ˆ˜
  • head(n) : DataFrame์˜ ์ฒ˜์Œ๋ถ€ํ„ฐ n์ค„์˜ ํ–‰์„ ์ถœ๋ ฅ
  • tail(n) : DataFrame์˜ ๋งˆ์ง€๋ง‰ n์ค„์˜ ํ–‰์„ ์ถœ๋ ฅ
  • describe() : Series, DataFrame์˜ ๊ฐ ์—ด์— ๋Œ€ํ•œ ์š”์•ฝ ํ†ต๊ณ„
  • dtypes : ๋ฐ์ดํ„ฐ ์ž๋ฃŒํ˜• ํ™•์ธ
df
Out[-] ์–ธ์–ด ์ˆ˜๋ฆฌ ๊ตญ ์˜ ์ˆ˜ 1ํ•™๋…„ 1๋ฐ˜ 72.0 61.0 98.0 2๋ฐ˜ 83.0 90.0 91.0 2ํ•™๋…„ 1๋ฐ˜ 55.0 71.0 NaN 2๋ฐ˜ 71.0 71.0 76.0
df.info()
Out[-] <class 'pandas.core.frame.DataFrame'> MultiIndex: 4 entries, (1ํ•™๋…„, 1๋ฐ˜) to (2ํ•™๋…„, 2๋ฐ˜) Data columns (total 3 columns): (์–ธ์–ด, ๊ตญ) 4 non-null float64 (์–ธ์–ด, ์˜) 4 non-null float64 (์ˆ˜๋ฆฌ, ์ˆ˜) 3 non-null float64 dtypes: float64(3) memory usage: 248.0+ bytes
df.head()
Out[-] ์–ธ์–ด ์ˆ˜๋ฆฌ ๊ตญ ์˜ ์ˆ˜ 1ํ•™๋…„ 1๋ฐ˜ 72.0 61.0 98.0 2๋ฐ˜ 83.0 90.0 91.0 2ํ•™๋…„ 1๋ฐ˜ 55.0 71.0 NaN 2๋ฐ˜ 71.0 71.0 76.0
df.tail()
Out[-] ์–ธ์–ด ์ˆ˜๋ฆฌ ๊ตญ ์˜ ์ˆ˜ 1ํ•™๋…„ 1๋ฐ˜ 72.0 61.0 98.0 2๋ฐ˜ 83.0 90.0 91.0 2ํ•™๋…„ 1๋ฐ˜ 55.0 71.0 NaN 2๋ฐ˜ 71.0 71.0 76.0
df.dtypes
Out[-] ์–ธ์–ด ๊ตญ float64 ์˜ float64 ์ˆ˜๋ฆฌ ์ˆ˜ float64 dtype: object
df.describe()
Out[-] ์–ธ์–ด ์ˆ˜๋ฆฌ ๊ตญ ์˜ ์ˆ˜ count 4.000000 4.000000 3.000000 mean 70.250000 73.250000 88.333333 std 11.528949 12.120919 11.239810 min 55.000000 61.000000 76.000000 25% 67.000000 68.500000 83.500000 50% 71.500000 71.000000 91.000000 75% 74.750000 75.750000 94.500000 max 83.000000 90.000000 98.000000
df.isnull() # ๊ฒฐ์ธก๊ฐ’ ํ™•์ธ, ๊ฒฐ๊ณผ๋Š” bool ํ˜•ํƒœ๋กœ ์ถœ๋ ฅ
Out[-] ์–ธ์–ด ์ˆ˜๋ฆฌ ๊ตญ ์˜ ์ˆ˜ 1ํ•™๋…„ 1๋ฐ˜ False False False 2๋ฐ˜ False False False 2ํ•™๋…„ 1๋ฐ˜ False False True 2๋ฐ˜ False False False
df.isnull().sum() # ๊ฒฐ์ธก๊ฐ’ ๊ฐœ์ˆ˜ ํ™•์ธ
Out[-] ์–ธ์–ด ๊ตญ 0 ์˜ 0 ์ˆ˜๋ฆฌ ์ˆ˜ 1 dtype: int64
ย 

๊ฐ’์˜ ์—ฐ๊ฒฐ

  • concat : DataFrame๋ผ๋ฆฌ ๊ฒฐํ•ฉ
    • axis=0 or 1 : ์•„๋ž˜๋กœ ๋ฐ์ดํ„ฐ ์—ฐ๊ฒฐ / ์˜†์œผ๋กœ ๋ฐ์ดํ„ฐ ์—ฐ๊ฒฐ
  • append : ๋งˆ์ง€๋ง‰ ํ–‰์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€
โ€ป concatenate : ๋ฐฐ์—ด๋ผ๋ฆฌ ๊ฒฐํ•ฉ
a = pd.DataFrame(np.arange(1, 10).reshape(3, 3)) a
Out[-] 0 1 2 0 1 2 3 1 4 5 6 2 7 8 9
b = pd.Series(np.arange(10, 40, 10)) b
Out[-] 0 10 1 20 2 30 dtype: int32
pd.concat([a, b], axis=1)
Out[-] 0 1 2 0 0 1 2 3 10 1 4 5 6 20 2 7 8 9 30
pd.concat([a, b], axis=1, ignore_index=True)
Out[-] 0 1 2 3 0 1 2 3 10 1 4 5 6 20 2 7 8 9 30
a.append(b, ignore_index=True)
Out[-] 0 1 2 0 1 2 3 1 4 5 6 2 7 8 9 3 10 20 30