Pandas: Pandas์˜ DataFrame์„ ํ–‰ ๋‹จ์œ„๋กœ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฐ€์žฅ ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2015๋…„ 06์›” 12์ผ  ยท  6์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: pandas-dev/pandas

df.iterrows() ๊ธฐ๋Šฅ์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์„ฑ๋Šฅ์ด ๋”์ฐํ•ฉ๋‹ˆ๋‹ค. iterrows() ๊ฐ€ ๊ฐ’ (ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ)์ด ์•„๋‹ˆ๋ผ ์ „์ฒด ์Šคํ‚ค๋งˆ ๋ฐ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ ๋œ Series ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•˜๋ฉด ๋†€๋ผ์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์‹œ๋„ํ•œ ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ for row in df.values ์ด๋ฉฐ ํ›จ์”ฌ ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ตœ๊ทผ์— df.values ์ด DataFrame์˜ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์‚ฌ์‹ค์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. df.values ๋Š” ๋ชจ๋“  dtypes ์„ ๊ณตํ†ต dtype ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‚ด ์—ด ์ค‘ ํ•˜๋‚˜์— dtype int64 ์žˆ์ง€๋งŒ df.values ์˜ dtype์€ ๋ชจ๋‘ float64 ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ df.values ์‹ค์ œ๋กœ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ์˜ ๋˜ ๋‹ค๋ฅธ ์‚ฌ๋ณธ์„ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์š”๊ตฌ ์‚ฌํ•ญ์€ ํ–‰ ๋ฐ˜๋ณต์ด ๋ฐ์ดํ„ฐ์˜ ์›๋ž˜ dtype ๋ฅผ ๋ณด์กดํ•˜๋Š” ๊ฐ’ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Usage Question

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‚˜๋Š” df.itertuples() ์ด ๋‹น์‹ ์ด ์ฐพ๊ณ ์žˆ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค-๊ทธ๊ฒƒ์€ ๋ฐ˜๋ณต๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฆ…๋‹ˆ๋‹ค :

In [10]: x = pd.DataFrame({'x': range(10000)})

In [11]: %timeit list(x.iterrows())
1 loops, best of 3: 383 ms per loop

In [12]: %timeit list(x.itertuples())
1000 loops, best of 3: 1.39 ms per loop

๋ชจ๋“  6 ๋Œ“๊ธ€

ํŒŒ์ด์ฌ์—์„œ ํ–‰์„ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์€ ๋ฒกํ„ฐํ™” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค (ํ›จ์”ฌ) ๋Š๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์—์„œ ์œ ํ˜•์ด ๋ณ€ํ™˜๋˜๋Š” ์ด์œ ๋Š” numpy ๋ฐฐ์—ด ( df.values ์ด ๋ฌด์—‡์ธ์ง€)์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. DataFrame์€ ์—ด ๊ธฐ๋ฐ˜์ด๋ฏ€๋กœ ์—ฌ๋Ÿฌ dtype์ด์žˆ๋Š” ๋‹จ์ผ DataFrame์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ–‰ ๋ฐฉ์‹์œผ๋กœ ๋ฐ˜๋ณตํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ๋ชจ๋“  ๊ฒƒ์„ ๋ณด์œ ํ•˜๋Š”๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ์œ ํ˜•์œผ๋กœ ์—… ์บ์ŠคํŠธ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๊ฒฝ์šฐ int๋Š” float64 ํ•ฉ๋‹ˆ๋‹ค.

์ตœ์†Œํ•œ์˜ ์ž‘์—… ์˜ˆ์ œ๋กœ ๋ฌธ์ œ๋ฅผ ์„ค๋ช…ํ•˜๋ฉด ๋ฒกํ„ฐํ™”ํ•˜๋Š” ๋ฐ ๋„์›€์„ ๋“œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. pandas ํƒœ๊ทธ๋กœ StackOverflow์—์„œ ์šด์ด ์ข‹์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

row_handler = RowHandler(sample_df)  # learn how to handle row from sample data
transformed_data = []
for row in df.values:
    transformed_data.append(row_handler.handle(row))
return transformed_data

๋‚˜๋Š” RowHandler ํด๋ž˜์Šค๋ฅผ ์†Œ์œ ํ•˜๊ณ  ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ ํ–‰ ๋‹จ์œ„๋กœ๋งŒ ์ž‘์—… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์œ ์‚ฌํ•œ ์˜ˆ๋Š” ํ–‰ ์ˆ˜์ค€์—์„œ๋งŒ ์˜ˆ์ธก API๊ฐ€์žˆ๋Š” ๋ชจ๋ธ์ด์žˆ๋Š” ๊ธฐ๊ณ„ ํ•™์Šต์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋„์›€์ด ๋˜๊ธฐ์—๋Š” ์—ฌ์ „ํžˆ ๋„ˆ๋ฌด ๋ชจํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ RowHandler ์ด ์ •๋ง๋กœ ๋‹น์‹ ์˜ ํ†ต์ œ๋ฅผ ๋ฒ—์–ด๋‚œ๋‹ค๋ฉด ๋‹น์‹ ์€ ์šด์ด ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. FWIW ๋ชจ๋“  scikit-learn์˜ API๋Š” ๋ฐฐ์—ด (์—ฌ๋Ÿฌ ํ–‰)์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋” ๋ช…ํ™•ํ•ด์งˆ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ, RowHandler ์€ (๋Š”) ์ œ์–ด ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์šด์ด ์—†๋‹ค๋Š” ๊ฒƒ์€ ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ๋‚ด ์งˆ๋ฌธ์€ ๊ฐ ์š”์†Œ์˜ dtype ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ํ–‰์„ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฐ€์žฅ ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. df.iterrows() ๋˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ์„ ์ œ์•ˆํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

sklearn ๋Š” PD์˜ DataFrame ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ์˜ˆ์™ธ์ด๋ฉฐ ํ‘œ์ค€์ด ์•„๋‹™๋‹ˆ๋‹ค. DataFrame ์—์„œ ์ž‘๋™ํ•˜๋Š” API๊ฐ€์žˆ๋Š” ๊ธฐ๊ณ„ ํ•™์Šต ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” df.itertuples() ์ด ๋‹น์‹ ์ด ์ฐพ๊ณ ์žˆ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค-๊ทธ๊ฒƒ์€ ๋ฐ˜๋ณต๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฆ…๋‹ˆ๋‹ค :

In [10]: x = pd.DataFrame({'x': range(10000)})

In [11]: %timeit list(x.iterrows())
1 loops, best of 3: 383 ms per loop

In [12]: %timeit list(x.itertuples())
1000 loops, best of 3: 1.39 ms per loop

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @shoyer! ๊ทธ๊ฒŒ ๋‚ด๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰