Pandas

Created : October 02, 2019

Pandas: Python์—์„œ ๋ฐ์ดํ„ฐ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์กด์žฌํ•˜๋Š” ๊ฐ€์žฅ ์ธ๊ธฐ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. 2์ฐจ์› ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ฐ€๊ณต,์ฒ˜๋ฆฌํ•จ.

Pandas์˜ ํ•ต์‹ฌ ๊ฐ์ฒด = DataFrame

  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ–‰๊ณผ ์—ด๋กœ ์ด๋ค„์ง„ 2์ฐจ์› ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ฒด
  • Index : ๊ฐœ๋ณ„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๋Š” key๊ฐ’. Series, DataFrame์€ ๋ชจ๋‘ Index๋ฅผ key๊ฐ’์œผ๋กœ ๊ฐ€์ง.
  • Series : ์—ด์ด ํ•˜๋‚˜๋ฟ์ธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ฒด
  • DataFrame : ์—ด์ด ์—ฌ๋Ÿฌ๊ฐœ์ธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ฒด. DataFrame์€ ์—ฌ๋Ÿฌ๊ฐœ์˜ Series๋กœ ์ด๋ค„์ง.
import pandas as pd

1. DataFrame

read_csv( )

ํŒŒ์ผ ๋กœ๋”ฉํ•˜๊ธฐ

  • csv : ์—ด์„ ์ฝค๋งˆ(,)๋กœ ๊ตฌ๋ถ„
  • ์ฝค๋งˆ ์™ธ์— ๋‹ค๋ฅธ ๋ฌธ์ž๋กœ ๊ตฌ๋ถ„ํ•˜๋ ค๋ฉด : read_csv(โ€˜ํŒŒ์ผ๋ช…โ€™, sep=โ€˜\tโ€™)
  • read_table( ) : ์—ด์„ ํƒญ์œผ๋กœ ๊ตฌ๋ถ„
df = pd.read_csv('C:/Users/.../train.csv')

pandas 1

  • csv ํŒŒ์ผ์„ ๋กœ๋”ฉํ•ด DataFrame ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜
  • ๋ณ„๋‹ค๋ฅธ ์ง€์ • ์—†์œผ๋ฉด, csv ํŒŒ์ผ ์ฒซ๋ฒˆ์งธ ์ค„์˜ ๋ฌธ์ž์—ด์„ ์นผ๋Ÿผ๋ช…์œผ๋กœ.
  • ๋งจ ์™ผ์ชฝ์˜ 0,1,2,3,โ€ฆ ์ˆซ์ž๋“ค์ด Pandas์˜ Index ๊ฐ’

    • ๋ชจ๋“  DataFrame ๋‚ด์˜ ๋ฐ์ดํ„ฐ๋Š” ์ƒ์„ฑ๋˜๋Š” ์ˆœ๊ฐ„ ๊ณ ์œ ์˜ Index๊ฐ’์„ ๊ฐ€์ง

< Explore DataFrame >

df.head(N)

df์˜ ๋งจ ์•ž์— ์žˆ๋Š” N๊ฐœ์˜ ํ–‰ ํ‘œ์‹œํ•˜๊ธฐ (๊ธฐ๋ณธ๊ฐ’ 5๊ฐœ)

df.shape

df ํฌ๊ธฐ ์•Œ์•„๋ณด๊ธฐ. ํ–‰๊ณผ ์—ด์„ tuple ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜.

df.info( )

์ด ๋ฐ์ดํ„ฐ ๊ฑด์ˆ˜, ๋ฐ์ดํ„ฐ ํƒ€์ž…, Null ๊ฑด์ˆ˜ ๋“ฑ pandas 2

df.describe( )

  • ์ˆซ์žํ˜• ๋ฐ์ดํ„ฐ๊ฐ’์˜ ๋ถ„ํฌ๋„, ํ‰๊ท ๊ฐ’, ์ตœ๋Œ€๊ฐ’, ์ตœ์†Œ๊ฐ’ ๋“ฑ
  • ์˜ค์ง ์ˆซ์žํ˜• ์—ด๋งŒ ์กฐ์‚ฌ. object ํƒ€์ž…์˜ ์—ด์€ ์ž๋™์œผ๋กœ ์ถœ๋ ฅ์—์„œ ์ œ์™ธ์‹œํ‚ด pandas 3

df[โ€˜columnโ€™].value_counts( )

  • ์นผ๋Ÿผ ๋ฐ์ดํ„ฐ๊ฐ’์˜ ์œ ํ˜•๊ณผ ๊ฑด์ˆ˜ ํ™•์ธํ•˜๊ธฐ
  • df[ ] ์•ˆ์— ์—ด๋ช… ์ž…๋ ฅํ•˜๋ฉด Series ํ˜•ํƒœ๋กœ ํŠน์ • ์—ด์˜ ๋ฐ์ดํ„ฐ์…‹์ด ๋ฐ˜ํ™˜๋จ
  • value_counts๋Š” DataFrame ์ „์ฒด์—๋Š” ์ ์šฉ ์•ˆ๋˜๊ณ  Series์—๋งŒ ์ ์šฉ๋จ. (๊ทธ๋ž˜์„œ df['์—ด'] ์ด๋ ‡๊ฒŒ ํ•ด๋‹น ์—ด์„ ์ง€์ •ํ•ด์ค˜์•ผํ•จ)

< ndarray, ๋ฆฌ์ŠคํŠธ โ†’ DataFrame๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ >

DataFrame์€ column๋ช…์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์„œ, DataFrame์œผ๋กœ ๋ณ€ํ™˜์‹œ ์ด column๋ช…์„ ์ง€์ •ํ•ด์ค˜์•ผํ•จ.

  • ๋ฏธ์ง€์ •์‹œ ์ž๋™์œผ๋กœ column๋ช…์„ ํ• ๋‹น
colname = ['col1']

# ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด DataFrame ์ƒ์„ฑ (columns์ธ์ž๋กœ column๋ช… ์ง€์ •)
df_list = pd.DataFrame([1, 2, 3], columns=colname)
 
# NumPy ndarray๋ฅผ ์ด์šฉํ•ด DataFrame ์ƒ์„ฑ
df_array = pd.DataFrame(np.array([1, 2, 3]), columns=colname)

pandas 4

colname = ['col1', 'col2', 'col3']
 
df_list = pd.DataFrame([[1, 2, 3], [11, 12, 13]], columns=colname)
df_array = pd.DataFrame(np.array([[1, 2, 3], [11, 12, 13]]), columns=colname)

pandas 5

< ๋”•์…”๋„ˆ๋ฆฌ โ†’ DataFrame๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ >

  • key๊ฐ’์€ column๋ช…์œผ๋กœ, value๊ฐ’์€ ํ•ด๋‹น column์˜ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜
  • key๋Š” ๋ฌธ์ž์—ด๋กœ, value๋Š” ๋ฆฌ์ŠคํŠธ๋‚˜ ndarray ํ˜•ํƒœ๋กœ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๊ตฌ์„ฑ
dict = {'col1':[1, 11], 'col2':[2, 22], 'col3':[3, 33]}
df_dict = pd.DataFrame(dict)

pandas 6

< DataFrame โ†’ ndarray, ๋ฆฌ์ŠคํŠธ, ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ >

df.values

DataFrame โ†’ ndarray

arr = df.values
 
>>> arr
[[ 1,  2,  3],
 [11, 22, 33]]   # NumPy์˜ ndarray ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜๋จ

df.values.tolist( )

DataFrame โ†’ ๋ฆฌ์ŠคํŠธ

  • df.values๋กœ ์–ป์€ ndarray์— tolist( ) ํ˜ธ์ถœ
lis = df.values.tolist()
 
>>> lis
[[1, 2, 3], [11, 22, 33]]

df.to_dict(โ€˜listโ€™)

DataFrame โ†’ ๋”•์…”๋„ˆ๋ฆฌ

  • ์ธ์ž๋กœ โ€˜listโ€™ ์ž…๋ ฅํ•˜๋ฉด ๋”•์…”๋„ˆ๋ฆฌ์˜ value๊ฐ’์ด ๋ฆฌ์ŠคํŠธํ˜•์œผ๋กœ ๋ฐ˜ํ™˜
  • ์ธ์ž๋กœ ์•„๋ฌด๊ฒƒ๋„ ์ž…๋ ฅ์•ˆํ•˜๋ฉด value๊ฐ’์ด ๋”•์…”๋„ˆ๋ฆฌ
dict = df.to_dict('list')
 
>>> dict
{'col1':[1, 11], 'col2':[2, 22], 'col3':[3, 33]}
 
dict = df.to_dict()
 
>>> dict
{'col1': {0: 1, 1: 11}, 'col2': {0: 2, 1: 22}, 'col3': {0: 3, 1: 33}}

2. DataFrame ์ƒ์„ฑ, ์ˆ˜์ •, ์‚ญ์ œ

< ์ƒˆ๋กœ์šด column ์ถ”๊ฐ€ํ•˜๊ธฐ >

  • ์ƒˆ๋กœ์šด series๊ฐ€ ๊ธฐ์กด DataFrame์— ์ถ”๊ฐ€๋จ
  • Series์— ์ƒ์ˆ˜๊ฐ’์„ ํ• ๋‹นํ•˜๋ฉด ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ’์ด ์ผ๊ด„์ ์œผ๋กœ ์ ์šฉ๋จ
  • ๊ธฐ์กด column์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด ์ƒˆ๋กœ์šด series๋ฅผ ๋งŒ๋“ค์ˆ˜๋„ ์žˆ์Œ
df['new'] = 0
df['age'] = 2019 - df['born']
df['age_by_10'] = df['age'] * 10

< ๊ธฐ์กด์˜ column ๋ฐ์ดํ„ฐ๊ฐ’ ์ผ๊ด„ ์ˆ˜์ •ํ•˜๊ธฐ >

df['age_by_10'] = df['age_by_10'] + 100

< DataFrame ๋ฐ์ดํ„ฐ ์‚ญ์ œํ•˜๊ธฐ >

df.drop(labels=None, axis=0, inplace=False)
 
# 'name, age, address' column์ด ์‚ญ์ œ๋œ df๋ฅผ ๋ฐ˜ํ™˜
drop_df = df.drop(['name', 'age', 'address'], axis=1)
  • labels : ์‚ญ์ œ ์›ํ•˜๋Š” ํ–‰์˜ ์ธ๋ฑ์Šค๊ฐ’ or column๋ช… ์ž…๋ ฅ
  • axis : axis=0 ํ–‰ ์‚ญ์ œ, axis=1 ์—ด ์‚ญ์ œ
  • inplace

    • ๊ธฐ๋ณธ๊ฐ’ False โ†’ ์›๋ž˜ DataFrame์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€ & drop๋œ DataFrame์„ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ณ€์ˆ˜๋กœ ๋ฐ˜ํ™˜
    • inplace=True โ†’ ์›๋ž˜ DataFrame์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œ & drop๋œ ๊ฒฐ๊ณผ๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ ์šฉ. ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’์€ None

3. Index ๊ฐ์ฒด

df.index

Index ๊ฐ์ฒด๊ฐ’ ํ™•์ธํ•˜๊ธฐ

df.index.values

Index ๊ฐ์ฒด์˜ ndarray ๊ฐ’ ํ™•์ธํ•˜๊ธฐ

df.reset_index( )

์ƒˆ๋กญ๊ฒŒ ์ธ๋ฑ์Šค๋ฅผ ์—ฐ์† ์ˆซ์žํ˜•์œผ๋กœ ํ• ๋‹น. ๊ธฐ์กด ์ธ๋ฑ์Šค๋Š” โ€˜indexโ€™๋ผ๋Š” ์ƒˆ๋กœ์šด column๋ช…์œผ๋กœ ์ถ”๊ฐ€.

  • Parameter๊ฐ’์œผ๋กœ drop=True ์„ค์ •ํ•˜๋ฉด ๊ธฐ์กด ์ธ๋ฑ์Šค๊ฐ€ ์ƒˆ๋กœ์šด ์นผ๋Ÿผ์œผ๋กœ ์ถ”๊ฐ€๋˜์ง€ ์•Š๊ณ  ์‚ญ์ œ๋จ

4. Data Selection & Filtering

< [ ] ์—ฐ์‚ฐ์ž >

  • DataFrame ๋’ค์˜ [ ]์— ์นผ๋Ÿผ์„ ์ง€์ •ํ•ด ์นผ๋Ÿผ ์ง€์ • ์—ฐ์‚ฐ์— ์‚ฌ์šฉ

    • ex) df[โ€˜ageโ€™]
  • Index ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜๊ฐ€๋Šฅํ•œ ํ‘œํ˜„์‹ (์Šฌ๋ผ์ด์‹ฑ or Boolean ์ธ๋ฑ์‹ฑ) ์€ [ ]๋‚ด์— ์ž…๋ ฅ ๊ฐ€๋Šฅ

    • df[0:2] : ์ฒซ 2๊ฐœ ๋ฐ์ดํ„ฐ ํ–‰์„ ์ถ”์ถœ โ†’ ๊ฐ€๋Šฅ์€ ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์Šฌ๋ผ์ด์‹ฑํ•ด์„œ ๋ฐ์ดํ„ฐ ์ถ”์ถœํ•˜๋Š” ๋ฐฉ์‹์€ ๋น„์ถ”!
    • df[df[โ€˜ageโ€™] == 30] : age์—ด ๊ฐ’์ด 30์ธ ๋ฐ์ดํ„ฐ๋งŒ ์ถ”์ถœ

DataFrame[ ]์—๋Š” ์นผ๋Ÿผ ์ง€์ • or Boolean ์ธ๋ฑ์‹ฑ์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•  ๊ฒƒ !!!

< ix[ ] ์—ฐ์‚ฐ์ž >

ix[ํ–‰, ์—ด] like ix[0, 'age'] โ†’ 0๋ฒˆ์งธ ํ–‰ + 'age'์—ด์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ’ ์ถ”์ถœ

  • ํ–‰ : ํ–‰์˜ index๊ฐ’ (index๊ฐ€ ์ˆซ์žํ˜•์ผ ๊ฒฝ์šฐ ๋ช…์นญ ๊ธฐ๋ฐ˜)
  • ์—ด : ์นผ๋Ÿผ๋ช… or ์นผ๋Ÿผ index๊ฐ’

์นผ๋Ÿผ๋ช…๊ณผ ์นผ๋Ÿผ์˜ index๊ฐ’ ๋‘๊ฐœ๊ฐ€ ํ˜ผ์šฉ๋˜์–ด ix ์—ฐ์‚ฐ์ž๋Š” ๊ณง ์‚ฌ๋ผ์ง€๊ณ , loc[ ]๊ณผ iloc[ ]์œผ๋กœ ๋‚˜๋‰˜์–ด์ง. ํ˜ผ๋™์„ ์ค„์ด๊ธฐ ์œ„ํ•ด loc[ ], iloc[ ] ์ค‘ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ. (๋‚ด์ƒ๊ฐ: ๋˜๋„๋ก์ด๋ฉด loc[ ]์œผ๋กœ ํ†ต์ผํ•˜๋Š”๊ฒŒ ๊น”๋”ํ•ด๋ณด์ž„)

< iloc[ ] ์—ฐ์‚ฐ์ž >

์นผ๋Ÿผ ์œ„์น˜(position) ๊ธฐ๋ฐ˜ ์ธ๋ฑ์‹ฑ

  • ํ–‰,์—ด์˜ ์œ„์น˜ ์ขŒํ‘œ๋กœ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ
  • ํ–‰,์—ด ๊ฐ’์œผ๋กœ int or ์Šฌ๋ผ์ด์‹ฑ or ํŒฌ์‹œ๋ฆฌ์ŠคํŠธ๋ฅผ ์ž…๋ ฅ
df.iloc[0, 0]   # 1๋ฒˆ์งธ ํ–‰, 1๋ฒˆ์งธ ์—ด ๊ฐ’
df.iloc[0, 'Name']   # ์˜ค๋ฅ˜๋ฐœ์ƒ
df.iloc[0:2, 0]   # 1,2๋ฒˆ์งธ ํ–‰, 1๋ฒˆ์งธ ์—ด ๊ฐ’ (0:2๋Š” 0,1๋งŒ ํฌํ•จ)

< loc[ ] ์—ฐ์‚ฐ์ž >

์นผ๋Ÿผ ๋ช…์นญ(label) ๊ธฐ๋ฐ˜ ์ธ๋ฑ์‹ฑ

  • DataFrame์˜ index๋‚˜ ์นผ๋Ÿผ๋ช…์œผ๋กœ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ
  • ํ–‰์—๋Š” index๊ฐ’์„, ์—ด์—๋Š” ์นผ๋Ÿผ๋ช…์„ ์ž…๋ ฅ
df.loc['one', 'Name']   # index๊ฐ’์ด 'one'์ธ ํ–‰์˜ 'Name'์—ด ๊ฐ’
df.loc[1, 'Name']   # index๊ฐ€ ์ˆซ์žํ˜•์ธ ๊ฒฝ์šฐ
df.loc[1:2, 'Name']   # 1,2๋ฒˆ์งธ ํ–‰์˜ 'Name'์—ด ๊ฐ’ (1:2๋Š” 1,2 ๋ชจ๋‘ ํฌํ•จ)

loc[ ]์—์„œ ์Šฌ๋ผ์ด์‹ฑ์€ '์‹œ์ž‘๊ฐ’๋ถ€ํ„ฐ ์ข…๋ฃŒ๊ฐ’-1' ๊นŒ์ง€๊ฐ€ ์•„๋‹ˆ๋ผ '์‹œ์ž‘๊ฐ’๋ถ€ํ„ฐ ์ข…๋ฃŒ๊ฐ’'๊นŒ์ง€์ž„! ๋ช…์นญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ธ๋ฑ์‹ฑ์„ ํ•˜๋Š”๋ฐ ๋ช…์นญ์€ ์ˆซ์žํ˜•์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ์–ด์„œ -1์„ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ.

< Boolean Indexing >

  • ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์กฐ๊ฑด์„ ix[ ] ๋‚ด์— ์ž…๋ ฅํ•˜๋ฉด ์ž๋™์œผ๋กœ ์›ํ•˜๋Š” ๊ฐ’์„ ํ•„ํ„ฐ๋ง
  • [ ], ix[ ], loc[ ]์—์„œ ๊ณตํ†ต์œผ๋กœ ์ง€์›

    • iloc[ ]๋Š” ์ •์ˆ˜ํ˜•๋งŒ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Boolean ์ธ๋ฑ์‹ฑ X
  • and ์กฐ๊ฑด : &, or ์กฐ๊ฑด : |, Not ์กฐ๊ฑด : ~
df[df['Age'] >= 30]   # 30์„ธ ์ด์ƒ์ธ ์‚ฌ๋žŒ์„ ๋ชจ๋‘ ๋ฐ˜ํ™˜
df[df['Age'] >= 30][['Name', 'Age']]   # 30์„ธ ์ด์ƒ์ธ ์‚ฌ๋žŒ์˜ '์ด๋ฆ„, ๋‚˜์ด'๋งŒ ์ถ”์ถœ
df.loc[df['Age'] >= 30, ['Name', 'Age']]   # loc ์ด์šฉ
df[(df['Age'] >= 30) & (df['Sex'] == 'female')]   # 30์„ธ ์ด์ƒ์ธ ์—ฌ์ž๋งŒ

5. Sorting

sort_values(by, ascending, inplace)

DataFrame๊ณผ Series์˜ ์ •๋ ฌ

  • by='์นผ๋Ÿผ๋ช…' : ํ•ด๋‹น ์นผ๋Ÿผ์œผ๋กœ ์ •๋ ฌ
  • ascending=True(๊ธฐ๋ณธ๊ฐ’) : ์˜ค๋ฆ„์ฐจ์ˆœ, ascending=False : ๋‚ด๋ฆผ์ฐจ์ˆœ
  • inplace=False(๊ธฐ๋ณธ๊ฐ’) : ์›๋ณธ ๋ฐ์ดํ„ฐ๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€, ์ •๋ ฌ๋œ DataFrame์„ ๋ฐ˜ํ™˜

6. Aggregation ํ•จ์ˆ˜

min( ), max( ), sum( ), count( ), mean( ) ๋“ฑ๋“ฑ

  • DataFrame์—์„œ aggregation ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ ๋ชจ๋“  ์นผ๋Ÿผ์— ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์ ์šฉ

    • ex) df.count( )ํ•˜๋ฉด ๋ชจ๋“  ์—ด ๊ฐ๊ฐ์˜ count๋ฅผ ๋ฐ˜ํ™˜
  • ํŠน์ • ์นผ๋Ÿผ์— ํ•จ์ˆ˜ ์ ์šฉํ•˜๋ ค๋ฉด df[['A์—ด', 'B์—ด']].max( )์ฒ˜๋Ÿผ ๋Œ€์ƒ ์นผ๋Ÿผ๋“ค๋งŒ ์ถ”์ถœ

7. groupby( )

  • by='์นผ๋Ÿผ๋ช…' : ํ•ด๋‹น ์นผ๋Ÿผ์œผ๋กœ groupby
df.groupby('Sex').count()   # ๋‚จ๋…€ ๊ตฌ๋ถ„ํ•ด 'Sex' ์นผ๋Ÿผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ชจ๋“  ์นผ๋Ÿผ์— count์ ์šฉ
df.groupby('Sex')[['Name', 'Age']].count()   # ๋‚จ๋…€ ๊ตฌ๋ถ„ํ•ด Name, Age ์นผ๋Ÿผ์—๋งŒ count์ ์šฉ
Sex Name Age
male 257 257
female 261 261
df.groupby('Sex')['Age'].agg([max, min])   # ๋‚จ๋…€ ๊ตฌ๋ถ„ํ•ด ๋‚˜์ด์˜ max, min๊ฐ’ ๋ฐ˜ํ™˜
Sex max min
male 70 15
female 75 14
agg_format = {'Age':'max', 'Amount':'sum', 'Salary':'mean'}
df.groupby('Sex').agg(agg_format)   # ์—ฌ๋Ÿฌ๊ฐœ์˜ ์นผ๋Ÿผ์— ์„œ๋กœ ๋‹ค๋ฅธ aggํ•จ์ˆ˜๋ฅผ ์“ธ ๊ฒฝ์šฐ
Sex Age Amount Salary
male 70 482 5271.23
female 75 469 5086.01

8. ๊ฒฐ์† ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌํ•˜๊ธฐ

  • ์นผ๋Ÿผ์— ๊ฐ’์ด ์—†๋Š” Null์ธ ๊ฒฝ์šฐ. NumPy์˜ NaN์œผ๋กœ ํ‘œ์‹œ
  • ML ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ด NaN ๊ฐ’์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ NaN๊ฐ’์„ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋Œ€์ฒดํ•ด์•ผํ•จ

isna( ) or isnull()

NaN ์—ฌ๋ถ€ ํ™•์ธ

df.isna()   # NaN์ด๋ฉด True, ์•„๋‹ˆ๋ฉด False
Sex Name Age Amount Salary
0 False False True True False
1 False False True False True
2 False False False False False
>>> df.isna().sum()   # NaN ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ
Sex     0
Name    0
Age     2
Amount  1
Salary  1

# Null๊ฐ’ ๊ฐœ์ˆ˜ ๊ตฌํ• ๋• df.isnull().sum()

fillna( )

NaN ๊ฐ’์„ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋Œ€์ฒด

# 1๋ฒˆ์งธ ๋ฐฉ๋ฒ•
df['Age'] = df['Age'].fillna(df['Age'].mean())   # 'Age'์นผ๋Ÿผ์˜ NaN๊ฐ’์„ ํ‰๊ท ๊ฐ’์œผ๋กœ ๋Œ€์ฒด

# 2๋ฒˆ์งธ ๋ฐฉ๋ฒ•
df['Age'].fillna(df['Age'].mean(), inplace=True)

fillna( )ํ•œ ๊ฒฐ๊ณผ๊ฐ’์„ ์›๋ณธ ๋ฐ์ดํ„ฐ์— ์ˆ˜์ •ํ•˜๋ ค๋ฉด

  • ์ฒซ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ฒ˜๋Ÿผ ๋ฐ˜ํ™˜๊ฐ’์„ df['Age']์— ๋‹ค์‹œ ์ •ํ•ด์ฃผ๊ฑฐ๋‚˜,
  • ๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ฒ˜๋Ÿผ inplace=True๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ์›๋ณธ ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆ˜์ •๋จ

9. apply lambda๋กœ ๋ฐ์ดํ„ฐ ๊ฐ€๊ณตํ•˜๊ธฐ

Python์˜ lambda์‹์„ Pandas DataFrame์— ์ ์šฉํ•œ ๊ฒƒ

df['Name_len'] = df['Name'].apply(lambda x: len(x))
df[['Name', 'Name_len']].head(3)
Name Name_len
0 Brad Pitt 9
1 Angelina Jolie 14
2 Matt Damon 10
# 20์„ธ ์ด์ƒ์€ 'Adult', 20์„ธ ๋ฏธ๋งŒ์€ 'Child'๋กœ ๊ตฌ๋ถ„ํ•˜๊ธฐ
df['Ageclass'] = df['Age'].apply(lambda x: 'Adult' if x >= 20 else 'Child')
df[['Age', 'Ageclass']].head(5)
Age Ageclass
0 42 Adult
1 17 Child
2 6 Child
3 29 Adult
4 61 Adult
# 61์„ธ ์ด์ƒ์€ 'Elderly', 20~60์„ธ๋Š” 'Adult', 20์„ธ ๋ฏธ๋งŒ์€ 'Child'๋กœ ๊ตฌ๋ถ„ํ•˜๊ธฐ
df['Ageclass'] = df['Age'].apply(lambda x: 'Elderly' if x > 60
                                else ('Adult' if x >= 20 else 'Child')
df[['Age', 'Ageclass']].head(5)

else if๋Š” ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ else์ ˆ์„ ( )๋กœ ๋‚ดํฌํ•ด ( ) ๋‚ด์—์„œ ๋‹ค์‹œ if else ์ ์šฉํ•ด์•ผํ•จ.

  • ํ•˜์ง€๋งŒ else if๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋‚˜ else์ ˆ์ด ๋งŽ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ๋”ฐ๋กœ ๋ณ„๋„์˜ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š”๊ฒŒ ๋‚˜์Œ.
  • Ageclass๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” def get_ageclass(age) ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ

    • df['Age'].apply(lambda x: get_ageclass(x))๋กœ ์ฒ˜๋ฆฌ
Age Ageclass
0 78 Elderly
1 14 Child
2 66 Elderly
3 30 Adult
4 45 Adult