Pandas: ์ „์ฒด ๋ณต์‚ฌ ์—†์ด ํ˜ผํ•ฉ dtype DataFrame์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• ์—†์Œ, ์ œ์•ˆ๋œ ์†”๋ฃจ์…˜

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

๋ช‡ ์‹œ๊ฐ„ ๋™์•ˆ ๋จธ๋ฆฌ๋ฅผ ์ฐข์€ ํ›„ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ  ํ˜ผํ•ฉ dtype DataFrame์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋ฌด์—‡์„ ํ•˜๋“ ์ง€ ํ˜ผํ•ฉ dtype DataFrame์„ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด , ๋‹น์‹ ์€ ํ•„์—ฐ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ์˜ ์ž„์‹œ ๋ฒ„์ „์„ ์ƒ์„ฑํ•  ๊ฒƒ์ด๊ณ (์˜ˆ๋ฅผ ๋“ค์–ด np.empty๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ), ๋‹ค์–‘ํ•œ DataFrame ์ƒ์„ฑ์ž๋Š” ํ•ญ์ƒ ์ด ์ž„์‹œ ๋ฒ„์ „์˜ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” 1๋…„ ์ „์— ์ด๋ฏธ ์ œ๊ธฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค: https://github.com/pydata/pandas/issues/5902.

์ด๊ฒƒ์€ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€์˜ ์ƒํ˜ธ ์šด์šฉ์„ฑ์— ํŠนํžˆ ๋”์ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด C์— ๋Œ€ํ•œ ํ˜ธ์ถœ์—์„œ DataFrame์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฑ„์šธ ๊ณ„ํš์ด๋ผ๋ฉด ์ง€๊ธˆ๊นŒ์ง€ ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ Python์—์„œ DataFrame์„ ๋งŒ๋“ค๊ณ  ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ(np.arrays)๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์ด๋Ÿฌํ•œ np๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. .arrays๊ฐ€ ์ฑ„์›Œ์งˆ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ƒํ™ฉ์—์„œ๋Š” DataFrame์ด ์–ด๋–ค ๋ฐ์ดํ„ฐ๋กœ ์‹œ์ž‘ํ•˜๋Š”์ง€ ์ƒ๊ด€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชฉํ‘œ๋Š” ๋ณต์‚ฌ ๋Œ€์ƒ์„ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋˜ํ•œ ์›์น™์ ์œผ๋กœ(ํŠน์ • ์ƒํ™ฉ ๋ฐ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ ๋“ฑ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Œ) ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๋‘ ๋ฐฐ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๋ณด์žฅํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์œผ๋กœ ์‹ค๋ง์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ด๋ฏธ ์–‘์  ํŒŒ์ด์ฌ ์Šคํƒ์— ๊ธฐ๋ฐ˜์„ ๋‘” ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. numpy์˜ ๋น„์–ด ์žˆ๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ๊ณต๊ฐ„์„ ํ• ๋‹นํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ๋ณต์‚ฌํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋น„์–ด ์žˆ์Œ์ด ์ด๋ฏธ ์‚ฌ์šฉ๋˜์—ˆ์œผ๋ฏ€๋กœ from_empty ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค(ํ•„์ˆ˜, ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” np.arange(N)๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ), ์—ด(ํ•„์ˆ˜, ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌธ์ž์—ด ๋ชฉ๋ก), ์œ ํ˜•(์—ด์— ๋Œ€ํ•ด ํ—ˆ์šฉ๋˜๋Š” ์œ ํ˜• ๋ชฉ๋ก, ์—ด๊ณผ ๋™์ผํ•œ ๊ธธ์ด)์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜• ๋ชฉ๋ก์—๋Š” ๋ชจ๋“  numpy ์ˆซ์ž ์œ ํ˜•(int, float)๊ณผ DatetimeIndex ๋ฐ Categorical๊ณผ ๊ฐ™์€ ํŠน์ˆ˜ Pandas ์—ด์— ๋Œ€ํ•œ ์ง€์›์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€๋กœ ๊ตฌํ˜„์ด ์™„์ „ํžˆ ๋ณ„๋„์˜ ๋ฐฉ์‹์œผ๋กœ ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด API์— ์ „ํ˜€ ์ง€์žฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

API Design Constructors Dtypes

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

SO์—๋Š” ์ด ๊ธฐ๋Šฅ์„ ์š”๊ตฌํ•˜๋Š” ๋งŽ์€ ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๋ฌธ์ œ๋Š” ๊ฐœ๋ณ„ ์—ด์„ ๋‹จ์ผ ๋ฉ”๋ชจ๋ฆฌ ์ฒญํฌ('๋ธ”๋ก')๋กœ ํ†ตํ•ฉํ•˜๋Š” BlockManager์—์„œ ๋น„๋กฏ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
copy=False๊ฐ€ ์ง€์ •๋œ ๊ฒฝ์šฐ ๊ฐ€์žฅ ์‰ฌ์šด ์ˆ˜์ •์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ธ”๋ก์œผ๋กœ ํ†ตํ•ฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋น„ ํ†ตํ•ฉ ์›์ˆญ์ด ํŒจ์น˜ BlockManager๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
https://stackoverflow.com/questions/45943160/can-memmap-pandas-series-what-about-a-dataframe
์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

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

์ธ๋ฑ์Šค์™€ ์—ด์ด ์žˆ๋Š” ๋นˆ ํ”„๋ ˆ์ž„์„ ๊ฐ„๋‹จํžˆ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ ndarrays๋ฅผ ํ• ๋‹นํ•˜์‹ญ์‹œ์˜ค. ํŠน์ • dtype์„ ํ•œ ๋ฒˆ์— ๋ชจ๋‘ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์€ ๋ณต์‚ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์›ํ•˜๋Š” ๊ฒฝ์šฐ np.empty๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

df = pd.DataFrame(index=range(2), columns=["dude", "wheres"])

df
Out[12]:
  dude wheres
0  NaN    NaN
1  NaN    NaN

x = np.empty(2, np.int32)

x
Out[14]: array([6, 0], dtype=int32)

df.dude = x

df
Out[16]:
   dude wheres
0     6    NaN
1     0    NaN

x[0] = 0

x
Out[18]: array([0, 0], dtype=int32)

df
Out[19]:
   dude wheres
0     6    NaN
1     0    NaN

๋‚˜์—๊ฒŒ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ์˜๋„ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๊ฑฐ๋‚˜ ๋ฐœ์ƒํ•œ ๋ณต์‚ฌ๊ฐ€ ๋‚ด๊ฐ€ ์ƒ๋žตํ•˜๋ ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๋ณต์‚ฌ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด.

๋‹น์‹ ์€ dtype์„ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค
๊ทธ๊ฒƒ์ด float๋กœ try๋ฅผ ๋ณต์‚ฌํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค.

y = np.empty(2, np.float64)

df
Out[21]:
   dude wheres
0     6    NaN
1     0    NaN

df.wheres = y

y
Out[23]: array([  2.96439388e-323,   2.96439388e-323])

y[0] = 0

df
Out[25]:
   dude         wheres
0     6  2.964394e-323
1     0  2.964394e-323

df = pd.DataFrame(index=range(2), columns=["dude", "wheres"])

df.dtypes
Out[27]:
dude      object
wheres    object
dtype: object

dtype์€ ๊ฐ์ฒด์ด๋ฏ€๋กœ float ๋˜๋Š” int๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

In [25]: arr = np.ones((2,3))

In [26]: df = DataFrame(arr,columns=['a','b','c'])

In [27]: arr[0,1] = 5

In [28]: df
Out[28]: 
   a  b  c
0  1  5  1
1  1  1  1

ํ˜ผํ•ฉ ์œ ํ˜•์—์„œ w/o ์‚ฌ๋ณธ์„ ๊ตฌ์„ฑํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์ƒ๋‹นํžˆ ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ผ๋ถ€ ์œ ํ˜•์— ๋ณต์‚ฌ๋ณธ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์˜ˆ: ๋ฉ”๋ชจ๋ฆฌ ๊ฒฝํ•ฉ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐœ์ฒด). ๊ทธ๋ฆฌ๊ณ  ๋‚ด๋ถ€ ๊ตฌ์กฐ๋Š” ๋‹ค๋ฅธ ์œ ํ˜•์„ ํ†ตํ•ฉํ•˜๋ฏ€๋กœ ์ƒˆ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์‚ฌ๋ณธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ณต์‚ฌ๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ๊ฒƒ์„ ๋งŒ๋“ค๊ณ  ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์–ป์€ ๋‹ค์Œ ๋ฎ์–ด์“ฐ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ์™œ ๋ฌธ์ œ์•ผ?

๋ฌธ์ œ๋Š” ๋‚ด๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•  ์˜์‚ฌ๊ฐ€ ์—†๋Š” ๋ฐ์ดํ„ฐ์ธ ์˜ฌ๋ฐ”๋ฅธ dtype์„ ๋ณต์‚ฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋นˆ DataFrame ์ƒ์„ฑ์— ๋Œ€ํ•œ ์ œ์•ˆ์ด ์ƒ๋‹นํ•œ RAM์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋”๋ผ๋„ ๋ณต์‚ฌ ๋น„์šฉ์ด ์ค„์–ด๋“ค์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. 1GB DataFrame์„ ๋งŒ๋“ค๊ณ  ๋‹ค๋ฅธ ๊ณณ์— ์ฑ„์šฐ๋ ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ์— 1GB์˜ ์“ฐ๋ ˆ๊ธฐ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๋น„์šฉ์„ ์ง€๋ถˆํ•ด์•ผ ํ•˜๋ฉฐ ์ด๋Š” ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๋ฌธ์ œ๋กœ ๋ณด์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์˜ˆ, ๋‚ด๋ถ€ ๊ตฌ์กฐ๊ฐ€ ์—ฌ๋Ÿฌ ์œ ํ˜•์„ ํ†ตํ•ฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๊ฒฝํ•ฉ ๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์ •ํ™•ํžˆ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์–ด๋–ค ๊ฒฝ์šฐ์—๋„ ๊ฐ์ฒด๋Š” ์‹ค์ œ๋กœ ์—ฌ๊ธฐ์„œ ๊ด€์‹ฌ์„ ๋„๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

์‚ฌ์‹ค, ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณต์‚ฌ๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ค์šด ๋ฌธ์ œ์ด์ง€๋งŒ, ์ฒ˜์Œ๋ถ€ํ„ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๊ฐ€ ์ œ์•ˆํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ณต์‚ฌ๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ์€ ์ƒ๋‹นํžˆ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ์—์„œ dtypes ๋ฐ ํ–‰ ์ˆ˜๋ฅผ ์œ ์ถ”ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๋Œ€์‹  dtypes ๋ฐ ํ–‰ ์ˆ˜๋ฅผ ์ง์ ‘ ์ง€์ •ํ•˜๊ณ  ๋ณต์‚ฌ๋ฅผ ๋บ€ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๋‹ค๋ฅธ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๋ฉด ๋ฐ์ดํ„ฐ์—์„œ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

์ง€์›๋˜๋Š” ๋ชจ๋“  ์—ด ์œ ํ˜•์— ๋Œ€ํ•ด "๋นˆ" ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. numpy ์ˆซ์ž ์œ ํ˜•์˜ ๊ฒฝ์šฐ ์ด๊ฒƒ์€ ๋ช…๋ฐฑํ•ฉ๋‹ˆ๋‹ค. DatetimeIndex์— ๋Œ€ํ•ด ํ™•์‹คํ•˜์ง€ ์•Š์€ Categorical์— ๋Œ€ํ•ด์„œ๋Š” 0์ด ์•„๋‹Œ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

dict๋ฅผ ์ƒ์„ฑ์ž์— ์ „๋‹ฌํ•˜๊ณ  copy=False๊ฐ€ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ด๊ฒƒ์€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ „๋‹ฌํ•˜๋Š” ๋ฐฐ์—ด์ด ๊ณ ์œ ํ•œ dtype์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ผ๋‹จ ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋ฌด์—‡์ด๋“  ํ•˜๋ฉด ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ YMMV. ๋ฌผ๋ก  1/0 ๋Œ€์‹ ์— np.empty ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

In [75]: arr = np.ones((2,3))

In [76]: arr2 = np.zeros((2,2),dtype='int32')

In [77]: df = DataFrame(arr,columns=list('abc'))

In [78]: df2 = DataFrame(arr2,columns=list('de'))

In [79]: result = pd.concat([df,df2],axis=1,copy=False)

In [80]: arr2[0,1] = 20

In [81]: arr[0,1] = 10

In [82]: result
Out[82]: 
   a   b  c  d   e
0  1  10  1  0  20
1  1   1  1  0   0

In [83]: result._data
Out[83]: 
BlockManager
Items: Index([u'a', u'b', u'c', u'd', u'e'], dtype='object')
Axis 1: Int64Index([0, 1], dtype='int64')
FloatBlock: slice(0, 3, 1), 3 x 2, dtype: float64
IntBlock: slice(3, 5, 1), 2 x 2, dtype: int32

In [84]: result._data.blocks[0].values.base
Out[84]: 
array([[  1.,  10.,   1.],
       [  1.,   1.,   1.]])

In [85]: result._data.blocks[1].values.base
Out[85]: 
array([[ 0, 20],
       [ 0,  0]], dtype=int32)

_ reindex ์ด(๊ฐ€) ์ด์ƒํ•œ "๊ธฐ๋Šฅ"์ธ ์บ์ŠคํŒ…์„ ๊ฐ•์ œ ์‹คํ–‰ํ•˜๋ฏ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์‚ญ์ œ๋œ ์ดˆ๊ธฐ ์‹œ๋„๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค._

์ด ์‹œ๋„๋ฅผ ์•ฝ๊ฐ„ ๋œ ๋งŒ์กฑ์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“œ๋Š” '๋ฉ”์„œ๋“œ'๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

arr = np.empty(1, dtype=[('x', np.float), ('y', np.int)])
df = pd.DataFrame.from_records(arr).reindex(np.arange(100))

์„ฑ๋Šฅ์— ๋Œ€ํ•ด ์ •๋ง๋กœ ๊ฑฑ์ •ํ•œ๋‹ค๋ฉด ๊ฐœ๋…์ ์œผ๋กœ ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์— numpy๋ฅผ ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๊ฐ€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

jreback, ์†”๋ฃจ์…˜ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Categoricals์—์„œ๋„ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(์ €๋ฅผ ๋†€๋ผ๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค). ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์•Œ๋ ค ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฌด์Šจ ๋ง์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋ฌด์—‡์ด๋“  ํ•˜๋ฉด ๋ณต์‚ฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌด์Šจ ๋œป์ธ๊ฐ€์š”? COW ์˜๋ฏธ ์ฒด๊ณ„๊ฐ€ ์—†๋Š” ํ•œ ๋‚˜๋Š” ๋‹น์‹ ์ด ๋ณด๋Š” ๊ฒƒ์ด ๊ฑด์„ค ์‹œ๊ฐ„์— ๊นŠ์€ ์‚ฌ๋ณธ๊ณผ ์–•์€ ์‚ฌ๋ณธ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์–ป๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ์ „ํžˆ from_empty ์ƒ์„ฑ์ž๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ์ˆ ์ด ์ž‘๋™ํ•˜๋Š” ๋™์•ˆ์—๋Š” ๋งŽ์€ ์ฝ”๋“œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์›์น™์ ์œผ๋กœ ์ด๊ฒƒ์€ ๋‹จ์ผ ๋ณตํ•ฉ dtype๊ณผ ์—ฌ๋Ÿฌ ํ–‰์„ ์ง€์ •ํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

bashtage์—์„œ ์ด๋Ÿฌํ•œ ์†”๋ฃจ์…˜์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ „์ฒด DataFrame์— ์”๋‹ˆ๋‹ค. ์“ฐ๊ธฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ๊ธฐ๋ณด๋‹ค ๋Š๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๊ปํ•ด์•ผ ๋ฌธ์ œ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ ˆ๋ฐ˜ ์ดํ•˜๋กœ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ ๋‚ด๊ฐ€ ๊ฐ€์„œ numpy๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด pandas์—๋Š” ๋‚ด๊ฐ€ ์‚ฌ๋ž‘ํ•˜๋Š” ๋งŽ์€ ๋ฉ‹์ง„ ๊ธฐ๋Šฅ๊ณผ ๊ธฐ๋Šฅ์ด ์žˆ๊ณ  ๊ทธ๊ฒƒ์„ ํฌ๊ธฐํ•˜๊ณ  ์‹ถ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์ •๋ง๋กœ ๋ฌป๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์ด ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์›ํ•˜์ง€ ์•Š์œผ๋ฉด numpy๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ์„ ์•”์‹œ ํ–ˆ์Šต๋‹ˆ๊นŒ?

๊ธ์–ด์ฃผ์„ธ์š”. ์‚ฌ์šฉ์ž ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. copy=False์ธ reindex_axis๊ฐ€ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

bashtage์—์„œ ์ด๋Ÿฌํ•œ ์†”๋ฃจ์…˜์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ „์ฒด DataFrame์— ์”๋‹ˆ๋‹ค. ์“ฐ๊ธฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ๊ธฐ๋ณด๋‹ค ๋Š๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๊ปํ•ด์•ผ ๋ฌธ์ œ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ ˆ๋ฐ˜ ์ดํ•˜๋กœ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์‹ค์ด์ง€๋งŒ method ๋Œ€ํ•œ ์ƒˆ method reindex ๋Š” ์•„๋ฌด๊ฒƒ๋„ ์ฑ„์›Œ์ง€์ง€ ์•Š์œผ๋ฉฐ ์“ฐ๊ธฐ/๋ณต์‚ฌ ์—†์ด ์ž„์˜์˜ ์—ด ์œ ํ˜•์œผ๋กœ ์œ ํ˜•์ด ์ง€์ •๋œ ๋ฐฐ์—ด์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ ๋‚ด๊ฐ€ ๊ฐ€์„œ numpy๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด pandas์—๋Š” ๋‚ด๊ฐ€ ์‚ฌ๋ž‘ํ•˜๋Š” ๋งŽ์€ ๋ฉ‹์ง„ ๊ธฐ๋Šฅ๊ณผ ๊ธฐ๋Šฅ์ด ์žˆ๊ณ  ๊ทธ๊ฒƒ์„ ํฌ๊ธฐํ•˜๊ณ  ์‹ถ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์ •๋ง๋กœ ๋ฌป๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์ด ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์›ํ•˜์ง€ ์•Š์œผ๋ฉด numpy๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ์„ ์•”์‹œ ํ–ˆ์Šต๋‹ˆ๊นŒ?

์•ฝ๊ฐ„ ์ˆ˜์‚ฌํ•™์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. numpy๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งค์šฐ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ค‘์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ฉ์–ด๋ฆฌ ์•ก์„ธ์Šค์— ๋” ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ๊ด€์ ์—์„œ ์ง„์ง€ํ•œ ์ œ์•ˆ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๊ณ ์„ฑ๋Šฅ ์ฝ”๋“œ. ์ฝ”๋“œ ๋‹จ์ˆœ์„ฑ์ด ์„ฑ๋Šฅ๋ณด๋‹ค ๋” ์ค‘์š”ํ•  ๋•Œ ํ•ญ์ƒ numpy์—์„œ pandas๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ๋งํ•˜๋Š” ๊ฒƒ์„ ๋ณธ๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•๋ณด๋‹ค ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ผ๋ถ€๊ฐ€ ๋” ๊นจ๋—ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์ง„ํ–‰๋จ์— ๋”ฐ๋ผ ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฝ๊ณ  ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

Pandas๋Š” ์—ฌ์ „ํžˆ ์ฃผ์š” ๋ชฉํ‘œ์ธ ์„ฑ๋Šฅ์„ ํ•˜๋‚˜๋กœ ๊ฐ•์กฐํ•ฉ๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ numpy์— ๋น„ํ•ด ๋” ๋†’์€ ์ˆ˜์ค€์˜ ๊ธฐ๋Šฅ์ด ์žˆ์œผ๋ฉฐ ๋น„์šฉ์„ ์ง€๋ถˆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ์€ ๋” ๋†’์€ ์ˆ˜์ค€์˜ ๊ธฐ๋Šฅ๊ณผ ์•„๋ฌด ๊ด€๋ จ์ด ์—†์œผ๋ฉฐ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ณณ์—์„œ ๋Œ€๋Ÿ‰ ์‚ฌ๋ณธ์— ๋น„์šฉ์„ ์ง€๋ถˆํ•ด์•ผ ํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๋…ผ์˜์™€ ์™„์ „ํžˆ ๋‹ค๋ฅธ ์—ด, ์ธ๋ฑ์Šค ๋“ฑ์„ ์„ค์ •ํ•˜๋Š” ๋น„์šฉ์— ๋Œ€ํ•ด ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์˜์•„ํ•ดํ•œ๋‹ค๋ฉด ๊ท€ํ•˜์˜ ์ œ์•ˆ์ด ์ ์ ˆํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ํŒŒ์ด์ฌ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋Š” ์ฝ”๋“œ์™€ ์ž‘์„ฑ ๋น„์šฉ์„ ๊ณผ๋Œ€ํ‰๊ฐ€ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ๋ถ€๋ถ„์€ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ž…๋‹ˆ๋‹ค. ๊ฐœ์ฒด ์ƒ์„ฑ๋„ ๋น„์šฉ์ด ๋งŽ์ด ๋“ญ๋‹ˆ๋‹ค.

๋‘˜ ๋‹ค 1GB์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋ฉฐ ํ•˜๋‚˜๋Š” ๋น„์–ด ์žˆ๊ณ  ํ•˜๋‚˜๋Š” 0์ž…๋‹ˆ๋‹ค.

%timeit np.empty(1, dtype=[('x', float), ('y', int), ('z', float)])
100000 loops, best of 3: 2.44 ยตs per loop

%timeit np.zeros(1, dtype=[('x', float), ('y', int), ('z', float)])
100000 loops, best of 3: 2.47 ยตs per loop

%timeit np.zeros(50000000, dtype=[('x', float), ('y', int), ('z', float)])
100000 loops, best of 3: 11.7 ยตs per loop

%timeit np.empty(50000000, dtype=[('x', float), ('y', int), ('z', float)])
100000 loops, best of 3: 11.4 ยตs per loop

150,000,000 ๊ฐ’์„ 0์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐ 3ยตs.

์ด์ œ ์ด๊ฒƒ์„ ๊ฐ„๋‹จํ•œ DataFrame์— ๋Œ€ํ•ด ๋น„๊ตํ•˜์‹ญ์‹œ์˜ค.

%timeit pd.DataFrame([[0]])
1000 loops, best of 3: 426 ยตs per loop

์‚ฌ์†Œํ•œ ๊ฒƒ์˜ ๊ฒฝ์šฐ ์•ฝ 200๋ฐฐ ๋Š๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋” ํฐ ์–ด๋ ˆ์ด์˜ ๊ฒฝ์šฐ ํ›จ์”ฌ ๋” ๋‚˜์ฉ๋‹ˆ๋‹ค.

%timeit pd.DataFrame(np.empty((50000000, 3)),copy=False)
1 loops, best of 3: 275 ms per loop

์ด ์•„๋ฌด๊ฒƒ๋„ ๋ณต์‚ฌ๋˜์ง€ ์•Š์•˜ ์Œ - ์ง€๊ธˆ์€ 275m์˜ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ๋น„์šฉ์€ ์ธ๋ฑ์Šค ๋“ฑ์„ ์„ค์ •ํ•˜๋Š” ๋ฐ ์†Œ์š”๋˜๋ฉฐ ๋ฐฐ์—ด์ด ๋งค์šฐ ํด ๋•Œ ๋ถ„๋ช…ํžˆ ๋งค์šฐ ๋Š๋ฆฝ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ pandas์˜ ๋‹ค๋ฅธ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋„ˆ๋ฌด ์ปค์„œ malloc + ์ฑ„์šฐ๊ธฐ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋น„์šฉ์ด ๊ฑฐ์˜ 0์— ๊ฐ€๊น๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์—๊ฒŒ ์‹œ๊ธฐ์ƒ์กฐ ์ตœ์ ํ™”์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

๋นก๋นกํ•œ ๋ฃจํ”„์—์„œ ๋ฌด์—‡์ด๋“  ํ• ๋‹นํ•˜๋ ค๋ฉด ์„ฑ๋Šฅ์ƒ์˜ ์ด์œ ๋กœ numpy ๋ฐฐ์—ด์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ข‹์•„, ์—ฌ๊ธฐ ์šฐ๋ฆฌ๊ฐ€ ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. @quicknir ๋‹น์‹ ์ด ๋ช‡ ๊ฐ€์ง€ ๊ฐœ์„ ์„ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด. 2 ๋ฌธ์ œ.

  • #4464 - ์ด๊ฒƒ์€ ๋ณธ์งˆ์ ์œผ๋กœ DataFrame ์ƒ์„ฑ์ž์—์„œ ๋ณตํ•ฉ dtype์„ ํ—ˆ์šฉํ•œ ๋‹ค์Œ from_records() ๋ฅผ ๋Œ๋ ค์„œ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ „๋‹ฌ๋œ ๋ฐฐ์—ด์ด rec/structured ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ์—๋„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ from_records rec/structured array ์ฒ˜๋ฆฌ ๊ฒฝ๋กœ๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • copy= ํ‚ค์›Œ๋“œ๋ฅผ from_records
  • from_records ๋Š” ์œ„์˜ concat soln์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. rec-array๋ฅผ ๋ถ„ํ• ํ•˜์—ฌ ์—ฐ์†์œผ๋กœ ์‚ญ์ œํ•œ ๋‹ค์Œ ๋‹ค์‹œ ํ•จ๊ป˜ dtype ๋ธ”๋ก์— ๋„ฃ์Šต๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„ ๋‚ด๋ถ€์ ์œผ๋กœ ์ˆ˜ํ–‰).

์ด๊ฒƒ์€ ์•ฝ๊ฐ„ ์ค‘์š”ํ•˜์ง€ ์•Š์ง€๋งŒ ํ˜ผํ•ฉ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ ์ƒ์„ฑ๋œ ndarray(๋น„์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ)๋ฅผ ๋งค์šฐ ์‰ฝ๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ (์ฒซ ๋ฒˆ์งธ ํŒจ์Šค ๊ตฌํ˜„์—์„œ) (int/float/string)๋งŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. datetime/timedelta๋Š” ํŠน๋ณ„ํ•œ ์œ„์ƒ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๊ณ  ์ด๋ฅผ ์ข€ ๋” ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ @bashtage ๋Š” ์„ฑ๋Šฅ ๊ด€์ ์—์„œ

๋‚ด๊ฐ€ ์œ„์—์„œ ์˜๋ฏธํ•œ ๊ฒƒ์€ ์ด๊ฒƒ์ด๋‹ค. Pandas๋Š” ์œ ์‚ฌํ•œ dtype(์˜ˆ: int64,int32๋Š” ๋‹ค๋ฆ„)์„ '๋ธ”๋ก'(ํ”„๋ ˆ์ž„์˜ 2์ฐจ์›)์œผ๋กœ ๊ทธ๋ฃนํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋“ค์€ ์—ฐ์† ๋ฉ”๋ชจ๋ฆฌ ndarray์ž…๋‹ˆ๋‹ค(ํ˜„์žฌ ๋‹จ์ผ dtype์—์„œ๋งŒ ์ž‘๋™ํ•˜๋Š” ๋‹จ์ˆœํžˆ ์ „๋‹ฌ๋˜์ง€ ์•Š๋Š” ํ•œ ์ƒˆ๋กœ ํ• ๋‹น๋จ). ๊ทธ๋Ÿฐ ๋‹ค์Œ df['new_columns'] = 5 ์™€ ๊ฐ™์€ setitem์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ด๋ฏธ int64 ๋ธ”๋ก์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ด ์ƒˆ ์—ด์€ ๊ถ๊ทน์ ์œผ๋กœ ์—ฌ๊ธฐ์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค(ํ•ด๋‹น dtype์— ๋Œ€ํ•œ ์ƒˆ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๊ฒฐ๊ณผ). ์ด์— ๋Œ€ํ•œ ๋ณด๊ธฐ๋กœ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด ๋” ์ด์ƒ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด DataFrame ๋‚ด๋ถ€์—์„œ ํ”ผ์–ด๋ง ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ „๋žต์ด ์•„๋‹Œ ์ด์œ ์ž…๋‹ˆ๋‹ค.

@bashtage yeh ํฐ ๋น„์šฉ์€ ๋‹น์‹ ์ด ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ธ๋ฑ์Šค์ž…๋‹ˆ๋‹ค. RangeIndex (#939 ์ฐธ์กฐ)๋Š” ์ด ๋ฌธ์ œ๋ฅผ ์™„์ „ํžˆ ํ•ด๊ฒฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. (์‹ค์ œ๋กœ๋Š” ์‚ฌ์ด๋“œ ๋ธŒ๋žœ์น˜์—์„œ ๊ฑฐ์˜ ์™„๋ฃŒ๋˜๋ฉฐ ์•ฝ๊ฐ„์˜ ๋จผ์ง€๋งŒ ์ œ๊ฑฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.)

์ตœ์ ํ™”๋œ RangeIndex ํ•˜๋”๋ผ๋„ NumPy ๋ฐฐ์—ด์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์—ฌ์ „ํžˆ 2๋ฐฐ ๋” ๋Š๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํ›จ์”ฌ ๋” ๋ฌด๊ฑฐ์šด ๋ฌด๊ฒŒ ํŠน์„ฑ๊ณผ DataFrame ์˜ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ถฉ๋ถ„ํžˆ ๊ณต์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ํŽธ์˜ ๊ธฐ๋Šฅ์œผ๋กœ ๊ฐ„์ฃผ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. DataFrame ๋˜๋Š” Panel ์™€ ๊ฐ™์€ ํ˜ผํ•ฉ ์œ ํ˜•์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

dtype=np.dtype([('GDP', np.float64), ('Population', np.int64)])
pd.Panel(items=['AU','AT'],
         major_axis=['1972','1973'],
         minor_axis=['GDP','Population'], 
         dtype=[np.float, np.int64])

์ด๊ฒƒ์€ API / ํŽธ์˜ ๋ฌธ์ œ ์ผ๋ฟ์ž…๋‹ˆ๋‹ค.

์„ฑ๋Šฅ์ด ์‹ค์ œ๋กœ ๋ถ€์ˆ˜์ ์ธ ๋ฌธ์ œ๋ผ๋Š” ๋ฐ ๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค(๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์•„๋‹˜).

@bashtage

%timeit pd.DataFrame(np.empty((100, 1000000)))
100๊ฐœ ๋ฃจํ”„, ์ตœ๊ณ  3๊ฐœ: ๋ฃจํ”„๋‹น 15.6ms

%timeit pd.DataFrame(np.empty((100, 1000000)), ๋ณต์‚ฌ=์ฐธ)
๋ฃจํ”„ 1๊ฐœ, ์ตœ๊ณ  3๊ฐœ: ๋ฃจํ”„๋‹น 302ms

๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์œผ๋กœ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์€ DataFrame ์ƒ์„ฑ๊ณผ ๊ด€๋ จ๋œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ž‘์—…๋ณด๋‹ค 20๋ฐฐ ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋ณต์‚ฌ(๋ฐ ์ถ”๊ฐ€ ํ• ๋‹น)๊ฐ€ ์‹œ๊ฐ„์˜ 95%์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ํ•œ ๋ฒค์น˜๋งˆํฌ๋Š” ์˜ฌ๋ฐ”๋ฅธ ๊ฒƒ์„ ๋ฒค์น˜๋งˆํ‚นํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ณต์‚ฌ ์ž์ฒด ๋˜๋Š” ํ• ๋‹น์— ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ์ค‘์š”ํ•˜์ง€ ์•Š์ง€๋งŒ ์š”์ ์€ ๋‹จ์ผ dtype DataFrame์— ๋Œ€ํ•ด ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ์—ฌ๋Ÿฌ dtype DataFrame์— ๋Œ€ํ•œ ๋ณต์‚ฌ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์—„์ฒญ๋‚œ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹น์‹ ์˜ 2๋‹จ๊ณ„ ์ถ”๋ก ๋„ ๊ธฐ๋งŒ์ ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ˆ˜ํ–‰๋˜๋Š” ์œ ์ผํ•œ ์ž‘์—…์ด ์•„๋‹ˆ๋ผ ๋””์Šคํฌ ์ฝ๊ธฐ์™€ ๊ฐ™์ด ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ๋‹ค๋ฅธ ์ž‘์—…์ด ์ˆ˜ํ–‰๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ง€๊ธˆ, DataFrame์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ถ”๊ฐ€ ๋ณต์‚ฌ๋ณธ์€ ๋””์Šคํฌ์—์„œ DataFrame์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๊ฐ„๋‹จํ•œ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์•ฝ ์ ˆ๋ฐ˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. 1/20์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค๋ฉด ๋””์Šคํฌ ์ฝ๊ธฐ๊ฐ€ ์ง€๋ฐฐ์ ์ผ ๊ฒƒ์ด๋ฉฐ(๋‹น์—ฐํžˆ ๊ทธ๋ž˜์•ผ ํ•จ) ์ถ”๊ฐ€ ๊ฐœ์„  ์‚ฌํ•ญ์€ ๊ฑฐ์˜ ํšจ๊ณผ๊ฐ€ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ €๋Š” ๋‘ ๋ถ„ ๋ชจ๋‘์—๊ฒŒ ๋‹ค์‹œ ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‹ค์ œ ์„ฑ๋Šฅ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

jreback์€ ์—ฐ๊ฒฐ ์ „๋žต์ด ๋ฒ”์ฃผํ˜•์— ๋Œ€ํ•ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์œ„์—์„œ ์ œ์•ˆํ•œ ๊ฐœ์„  ์‚ฌํ•ญ์ด ํšจ๊ณผ๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋‚˜๋Š” ๋” ๋‚˜์€ ์ถœ๋ฐœ์ ์ด reindex๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ฌธ์ œ๋Š” reindex๊ฐ€ ๋งŽ์€ ์ถ”๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์›์น™์ ์œผ๋กœ ํ–‰์ด 0์ธ DataFrame์—๋Š” ๋ถˆํ•„์š”ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ •ํ™•ํ•œ ํ–‰ ์ˆ˜๋กœ DataFrame์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Btw, ์ด๊ฒƒ์€ ํŒฌ๋”๊ฐ€ ์Šคํ‚ค๋งˆ ๊ฐ์ฒด๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง€๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๊ฑด ๋‹ค๋ฅธ ๋‚ ์˜ ๋…ผ์˜์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋™์˜ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ๋™์˜ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. IMO DataFrames๋Š” ๊ธฐ๋ณธ numpy ๋ฐฐ์—ด๊ณผ DataFrame ์ƒ์„ฑ ์‚ฌ์ด์˜ ํฐ ์ฐจ์ด์˜ ์ˆœ์„œ๋กœ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์ˆซ์ž ์ƒํƒœ๊ณ„์—์„œ ๊ทนํ•œ์˜ ์„ฑ๋Šฅ ๊ฐœ์ฒด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

%timeit np.empty((1000000, 100))
1000 loops, best of 3: 1.61 ms per loop

%timeit pd.DataFrame(np.empty((1000000,100)))
100 loops, best of 3: 15.3 ms per loop

๋ฐ”๋กœ ์ง€๊ธˆ, DataFrame์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ถ”๊ฐ€ ๋ณต์‚ฌ๋ณธ์€ ๋””์Šคํฌ์—์„œ DataFrame์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๊ฐ„๋‹จํ•œ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์•ฝ ์ ˆ๋ฐ˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. 1/20์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค๋ฉด ๋””์Šคํฌ ์ฝ๊ธฐ๊ฐ€ ์ง€๋ฐฐ์ ์ผ ๊ฒƒ์ด๋ฉฐ(๋‹น์—ฐํžˆ ๊ทธ๋ž˜์•ผ ํ•จ) ์ถ”๊ฐ€ ๊ฐœ์„  ์‚ฌํ•ญ์€ ๊ฑฐ์˜ ํšจ๊ณผ๊ฐ€ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด DataFrame ์„ฑ๋Šฅ์— ๋Œ€ํ•ด ์‹ ๊ฒฝ ์“ธ ์ด์œ ๊ฐ€ ํ›จ์”ฌ ์ ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. 100% ๋ฌด๋ฃŒ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ด๋„ ์ด ํ”„๋กœ๊ทธ๋žจ ์‹œ๊ฐ„์€ 50%๋งŒ ๊ฐ์†Œํ•ฉ๋‹ˆ๋‹ค.

์„ฑ๋Šฅ ๋ฌธ์ œ๋กœ ์ƒ๊ฐํ•˜๋“  ํŽธ์˜ ๋ฌธ์ œ๋กœ ์ƒ๊ฐํ•˜๋“  ์ƒ๊ด€์—†์ด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์—์„œ PR์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด POV์—์„œ๋Š” ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•  ๋•Œ ํ•ญ์ƒ numpy ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ›„์ž๋กœ ๋ด…๋‹ˆ๋‹ค. Numpy๋Š” (์—ด์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฐฐ์—ด์„ ํ™•์žฅํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€) ์ผ๋ถ€ ์ž‘์—…์— ๋น„๊ต์  ํšจ์œจ์ ์ธ ๋ธ”๋ก ๊ด€๋ฆฌ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ๊ด€์ ์—์„œ ๋‚˜์˜๋‹ค.

๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ์œ„์—์„œ ์ œ๊ณตํ•œ ์˜ˆ์ œ์™€ ๊ฐ™์ด ๋นˆ ์ƒ์„ฑ์ž์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์•„๋ฌด ๊ฒƒ๋„ ๋ณต์‚ฌํ•˜์ง€ ์•Š์ง€๋งŒ pandas์˜ ๋‹ค๋ฅธ ๊ฒƒ๋“ค๊ณผ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Null์„ ์ฑ„์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Null ์ฑ„์šฐ๊ธฐ๋Š” ๋งค์šฐ ์ €๋ ดํ•˜๋ฉฐ IMO ๋ฌธ์ œ์˜ ๊ทผ๋ณธ ์›์ธ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋ฏธ๋ฆฌ ํ˜•์„ฑ๋œ ๋ธ”๋ก์„ ๋ธ”๋ก ๊ด€๋ฆฌ์ž์—๊ฒŒ ๋ฐ”๋กœ ์ „๋‹ฌํ•˜๋Š” DataFrame.from_blocks ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ™์€ ๊ฒƒ

DataFrame.from_blocks([np.empty((100,2)), 
                       np.empty((100,3), dtype=np.float32), 
                       np.empty((100,1), dtype=np.int8)],
                     columns=['f8_0','f8_1','f4_0','f4_1','f4_2','i1_0'],
                     index=np.arange(100))

์ด ์œ ํ˜•์˜ ๋ฐฉ๋ฒ•์€ ๋ธ”๋ก์ด ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ ๋ชจ์–‘์„ ๊ฐ–๊ณ  ๋ชจ๋“  ๋ธ”๋ก์ด ๊ณ ์œ ํ•œ ์œ ํ˜•์„ ๊ฐ€์ง€๋ฉฐ ์ธ๋ฑ์Šค ๋ฐ ์—ด์˜ ๋ชจ์–‘์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๊ฒ€์‚ฌ๋ฅผ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค. ์ด ์œ ํ˜•์˜ ๋ฐฉ๋ฒ•์€ ๋ฐ์ดํ„ฐ์— ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š์œผ๋ฉฐ BlockManger์—์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@quicknir ๋‹น์‹ ์€ ๊ฝค ๋ณต์žกํ•œ ๊ฒƒ๋“ค์„ ๊ฒฐํ•ฉํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๋ฒ”์ฃผํ˜•์€ numpy์— ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ ์˜คํžˆ๋ ค ํŒฌ๋” ๊ตฌ์กฐ์™€ ๊ฐ™์€ ๋ณตํ•ฉ dtype์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ณ„๋„๋กœ ๊ตฌ์„ฑํ•˜๊ณ  ํ• ๋‹นํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์‹ค์ œ๋กœ ๋งค์šฐ ์ €๋ ดํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค๋ฅธ ๋‹จ์ผ dtype๊ณผ ๊ฐ™์€ ๋ธ”๋ก์œผ๋กœ ๊ฒฐํ•ฉ๋˜์ง€ ์•Š์Œ).

@bashtage soln์ด ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ช‡ ๊ฐ€์ง€ ๊ฐ„๋‹จํ•œ ๊ฒ€์‚ฌ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ๋‚ด๋ถ€ ๋ฃจํ‹ด์— ์˜ํ•ด ํ˜ธ์ถœ๋จ). ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ์ž๋Š” ๋‚ด๋ถ€ ๋‹ด๋‹น์ž์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์ •๋ง๋กœ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‹น์‹ ์€ ์ด๊ฒƒ์„ ์ธ์‹ํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธด ํ•ด๋„, ์™œ ๋‹น์‹ ์ด ์›ํ•˜๋Š” ๊ฒƒ๊ณผ ๋˜‘๊ฐ™์€ ํ”„๋ ˆ์ž„์„ ๋งŒ๋“ค์ง€ ์•Š๋Š”์ง€ ์•„์ง๋„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ธ”๋ก ํฌ์ธํ„ฐ๋ฅผ ์žก๊ณ  ๊ฐ’์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋น„์šฉ์ด ์†Œ์š”๋˜๋ฉฐ @bashtage๊ฐ€ ์ง€์ ํ–ˆ๋“ฏ์ด ์ด๋ฏธ ์„ค์ •๋œ null ํ”„๋ ˆ์ž„(๋ชจ๋“  dtype,index,columns ํฌํ•จ)์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ €๋ ดํ•ฉ๋‹ˆ๋‹ค.

๋นˆ ์ƒ์„ฑ์ž๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ํ–‰๊ณผ ์›ํ•˜๋Š” ์Šคํ‚ค๋งˆ๊ฐ€ ์—†๋Š” ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์„ ๊ตฌ์„ฑํ•˜๊ณ  reindex๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ copy=True๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์ œ์•ˆ์€ ํ•ฉ๋ฆฌ์ ์ด์ง€๋งŒ ๋ฒ”์ฃผํ˜•์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ฃผ์ œ์— ๋Œ€ํ•ด ์ €๋Š” ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ณ  Categorical์ด ํ†ตํ•ฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ง๊ฐ์ ์œผ๋กœ ์ •์ˆ˜ ๋ฐฐ์—ด๊ณผ ๋‘ ๊ฐœ์˜ ๋ฒ”์ฃผํ˜• Series๋ฅผ ๋งŒ๋“  ๋‹ค์Œ ์„ธ ๊ฐœ์˜ DataFrame์„ ๋งŒ๋“ค๊ณ  ์„ธ ๊ฐœ๋ฅผ ๋ชจ๋‘ ์—ฐ๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋‘ ๊ฐœ์˜ DataFrame์ด ๋™์ผํ•œ dtype์„ ๊ฐ€์กŒ์Œ์—๋„ ๋ณต์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Datetime Index์—์„œ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@jreback ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๋‹น์‹ ์ด ์›ํ•˜๋Š” ๋Œ€๋กœ ์ •ํ™•ํžˆ ํ”„๋ ˆ์ž„์„ ๋งŒ๋“ ๋‹ค๋Š” ๋ง์˜ ์˜๋ฏธ๋ฅผ ๋”ฐ๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@quicknir ์‹ค์ œ๋กœ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ์ž‘์—…์˜ ์ฝ”๋“œ/์˜์‚ฌ ์ฝ”๋“œ ์ƒ˜ํ”Œ์„ ํ‘œ์‹œํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

def read_dataframe(filename, ....):
   f = my_library.open(filename)
   schema = f.schema()
   row_count = f.row_count()
   df = pd.DataFrame.from_empty(schema, row_count)
   dict_of_np_arrays = get_np_arrays_from_DataFrame(df)
   f.read(dict_of_np_arrays)
   return df

์ด์ „ ์ฝ”๋“œ๋Š” ๋จผ์ € numpy ๋ฐฐ์—ด์˜ ์‚ฌ์ „์„ ๊ตฌ์„ฑํ•œ ๋‹ค์Œ ๋ชจ๋“  ๊ฒƒ์„ ๋ณต์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์‚ฌ์ „์—์„œ DataFrame์„ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฑฐ์˜ ์ ˆ๋ฐ˜์˜ ์‹œ๊ฐ„์ด ๊ทธ๊ฒƒ์— ์†Œ๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด ์ œ๋„๋กœ ๋ฐ”๊พธ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๋‚ด์šฉ์— ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์•„๋„ ์œ„์™€ ๊ฐ™์ด df๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋น„์šฉ์ด ๋งŽ์ด ๋“ ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

np ๋ฐฐ์—ด์˜ @quicknir ์‚ฌ์ „์€ ๋งŽ์€ ๋ณต์‚ฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

# construct your biggest block type (e.g. say you have mostly floats)
df = DataFrame(np.empty((....)),index=....,columns=....)

# then add in other things you need (say strings)
df['foo'] = np.empty(.....)

# say ints
df['foo2'] = np.empty(...)

dtype์œผ๋กœ ์ด๊ฒƒ์„ ํ•˜๋ฉด ์ €๋ ดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ ๋‹ค์Œ์—.

for dtype, block in df.as_blocks():
    # fill the values
    block.values[0,0] = 1

์ด๋Ÿฌํ•œ ๋ธ”๋ก ๊ฐ’์€ numpy ๋ฐฐ์—ด์— ๋Œ€ํ•œ ๋ณด๊ธฐ์ด๋ฏ€๋กœ

์œ ํ˜•์˜ ๊ตฌ์„ฑ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฏธ๋ฆฌ ์•Œ๋ ค์ ธ ์žˆ์ง€ ์•Š์œผ๋ฉฐ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ float์™€ int์˜ ๊ฑด๊ฐ•ํ•œ ํ˜ผํ•ฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด 30๊ฐœ์˜ float ์—ด๊ณผ 10๊ฐœ์˜ int ์—ด์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ €๋ ดํ•  ๊ฒƒ์ธ์ง€ ๋”ฐ๋ฅด์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ, float๋Š” ๋งค์šฐ ์ €๋ ดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ int๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋‚ด๊ฐ€ ๋ˆ„๋ฝ๋œ ๋ชจ๋“  ๊ฒƒ์„ ํ•œ ๋ฒˆ์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋Š” ํ•œ int ์—ด์„ ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ์ „์ฒด int ๋ธ”๋ก์ด ์žฌํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.

์ด์ „์— ๋‚˜์—๊ฒŒ ์ œ๊ณตํ•œ ์†”๋ฃจ์…˜์ด ๊ฑฐ์˜ ์ž‘๋™ํ•˜๊ณ  ์žˆ๋Š”๋ฐ DatetimeIndex์—์„œ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋นˆ ์ƒ์„ฑ์ž๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ํ–‰๊ณผ ์›ํ•˜๋Š” ์Šคํ‚ค๋งˆ๊ฐ€ ์—†๋Š” ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์„ ๊ตฌ์„ฑํ•˜๊ณ  reindex๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ copy=True๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.

๋นˆ ์ƒ์„ฑ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

dtype=np.dtype([('a', np.float64), ('b', np.int64), ('c', np.float32)])
df = pd.DataFrame(columns='abc',index=np.arange(100),dtype=dtype)

์ด๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๋™์ผํ•œ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

dtype=np.dtype([('a', np.float64), ('b', np.int64), ('c', np.float32)])
arr = np.empty(100, dtype=dtype)
df = pd.DataFrame.from_records(arr, index=np.arange(100))

๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜์ง€ ์•Š์„ ๋ฟ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ์„ฑ์ž๋Š” ๋‹ค์Œ ํ˜ธ์ถœ์— ๋Œ€ํ•ด ํ˜ผํ•ฉ dtype์„ ํ—ˆ์šฉํ•˜์ง€๋งŒ ๊ธฐ๋ณธ dtype์€ ํ•˜๋‚˜๋งŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

df = pd.DataFrame(columns=['a','b','c'],index=np.arange(100), dtype=np.float32)

์œ ์ผํ•œ ๋‹ค๋ฅธ _feature_๋Š” int์— ๋Œ€ํ•œ ๋ˆ„๋ฝ ๊ฐ’์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด dtype์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ถ€์ž‘์šฉ์ด ์žˆ๋Š” null-filling int ๋ฐฐ์—ด์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์ œ์•ˆ์€ ํ•ฉ๋ฆฌ์ ์ด์ง€๋งŒ ๋ฒ”์ฃผํ˜•์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ฃผ์ œ์— ๋Œ€ํ•ด ์ €๋Š” ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ณ  Categorical์ด ํ†ตํ•ฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ง๊ฐ์ ์œผ๋กœ ์ •์ˆ˜ ๋ฐฐ์—ด๊ณผ ๋‘ ๊ฐœ์˜ ๋ฒ”์ฃผํ˜• Series๋ฅผ ๋งŒ๋“  ๋‹ค์Œ ์„ธ ๊ฐœ์˜ DataFrame์„ ๋งŒ๋“ค๊ณ  ์„ธ ๊ฐœ๋ฅผ ๋ชจ๋‘ ์—ฐ๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋‘ ๊ฐœ์˜ DataFrame์ด ๋™์ผํ•œ dtype์„ ๊ฐ€์กŒ์Œ์—๋„ ๋ณต์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Datetime Index์—์„œ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

from_block ๋ฉ”์„œ๋“œ๋Š” ์—ฌ๋Ÿฌ ๋ฒ”์ฃผ๋ฅผ ํ—ˆ์šฉํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๊ธฐ๋ณธ ์œ ํ˜• ์ค‘ ํ•˜๋‚˜๋งŒ ํ—ˆ์šฉํ•˜๋„๋ก ํ†ตํ•ฉ ๊ทœ์น™์„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋„ต.. ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€ ์•Š์•„์š”.... ๋‚ด๋ถ€๋ฅผ ์นœ์ ˆํ•˜๊ฒŒ ์†Œ๊ฐœํ•ด์ฃผ์‹ค ๋ถ„์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค..... ํžŒํŠธ.ํžŒํŠธ.ํžŒํŠธ.... :)

ํ•˜ํ•˜, ๊ตฌํ˜„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์˜ํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜คํ•ดํ•˜์ง€ ๋งˆ์„ธ์š”. ์ด๋ฒˆ ์ฃผ๋ง์— ๋‚ด๋ถ€๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์–ด๋–ค ์ƒ์„ฑ์ž๊ฐ€ ๊ตฌํ˜„ํ•˜๊ธฐ ๋” ์‰ฌ์šด์ง€ ์ดํ•ดํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋จผ์ € ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ผ๋ถ€ DatetimeIndex ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@quicknir ์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ?

cython ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์—ด์„ ๋ณต์‚ฌ ์—†์ด ์ฑ„์šธ ์ˆ˜ ์žˆ๋„๋ก ํ˜ผํ•ฉ dtype ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์„ ์ €๋ ดํ•˜๊ฒŒ ํ• ๋‹น(์ฑ„์šฐ๊ธฐ๋Š” ์•„๋‹˜)ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋„๋ก ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ฝ”๋“œ(๋ฐ˜ ์ž‘์—… ํฌํ•จ)๋ฅผ ๊ธฐ๊บผ์ด ๊ณต์œ ํ•ด ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ํ•ฉ๋ฆฌ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋ ๊นŒ์š”? ํ”„๋กœํ† ํƒ€์ž… ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์—์„œ ์ž‘์—…ํ•˜์—ฌ ์ฐจ๋‹จ ๋…ผ๋ฆฌ๋ฅผ ๋‹ค์‹œ ๋งŒ๋“œ๋Š” ๋‹จ๊ณ„๋ฅผ ๊ฑด๋„ˆ๋›ฐ์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฒ”์ฃผํ˜•๊ณผ ๋ณ„๋„๋กœ ์–ด๋–ค dtypes์— ํŠน๋ณ„ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

๋ฌผ๋ก  ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ฑ„์›Œ์งˆ ๋•Œ๊นŒ์ง€ ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค...

import numpy as np
from pandas.core.index import _ensure_index
from pandas.core.internals import BlockManager
from pandas.core.generic import NDFrame
from pandas.core.frame import DataFrame
from pandas.core.common import CategoricalDtype
from pandas.core.categorical import Categorical
from pandas.core.index import Index

def allocate_like(df, size, keep_categories=False):
    # define axes (waiting for #939 (RangeIndex))
    axes = [df.columns.values.tolist(), Index(np.arange(size))]

    # allocate and create blocks
    blocks = []
    for block in df._data.blocks:
        # special treatment for non-ordinary block types
        if isinstance(block.dtype, CategoricalDtype):
            if keep_categories:
                categories = block.values.categories
            else:
                categories = Index([])
            values = Categorical(values=np.empty(shape=block.values.shape,
                                                 dtype=block.values.codes.dtype),
                                 categories=categories,
                                 fastpath=True)
        # ordinary block types
        else:
            new_shape = (block.values.shape[0], size)
            values = np.empty(shape=new_shape, dtype=block.dtype)

        new_block = block.make_block_same_class(values=values,
                                                placement=block.mgr_locs.as_array)
        blocks.append(new_block)

    # create block manager
    mgr = BlockManager(blocks, axes)

    # create dataframe
    return DataFrame(mgr)


# create a prototype dataframe
import pandas as pd
a = np.empty(0, dtype=('i4,i4,f4,f4,f4,a10'))
df = pd.DataFrame(a)
df['cat_col'] = pd.Series(list('abcabcdeff'), dtype="category")

# allocate an alike dataframe
df1 = allocate_like(df, size=10)

@ARF1 ์ตœ์ข… ๋ชฉํ‘œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

copy=False์™€ ํ•จ๊ป˜ ์ถ”๊ฐ€ concat์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๊ฒƒ์„ ํšŒํ”ผํ•ฉ๋‹ˆ๋‹ค.

@jreback ์„ฑ๋Šฅ์ƒ์˜ ์ด์œ ๋กœ ์ค‘๊ฐ„ ๋ณต์‚ฌ ์—†์ด ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์œผ๋กœ ์ง์ ‘ ์••์ถ•์„ ํ’€๊ณ  ์‹ถ์€ ์••์ถ•๋œ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์—์„œ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์—ด๋ณ„๋กœ ์ฝ๊ธฐ ์œ„ํ•ด cython ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์ธ numpy ์†”๋ฃจ์…˜์—์„œ ์ฐจ์šฉํ•˜์—ฌ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๋‚ด cython ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ํ• ๋‹นํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ค‘๊ฐ„ ๋ณต์‚ฌ ๋‹จ๊ณ„(๋˜๋Š” ์ค‘๊ฐ„ ํŒŒ์ด์ฌ ๊ฐ์ฒด ์ƒ์„ฑ) ์—†์ด ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์„ ์ง์ ‘ ์ฑ„์šฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ. ๋ฆด๋ฆฌ์Šค๋œ gil๊ณผ ๋ณ‘๋ ฌ๋กœ ์—ฌ๋Ÿฌ cython ์Šค๋ ˆ๋“œ๋กœ ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์„ ์ฑ„์šฐ๋Š” ์˜ต์…˜์€ ๋ถ€๊ฐ€์ ์ธ ์ด์ ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(๋‹จ์ˆœํ™”๋œ) ์˜์‚ฌ ์ฝ”๋“œ์—์„œ idom์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

df = fn_to_allocate_memory()
colums = df.columns.values
column_indexes = []
for i in xrange(len(df._data.blocks)):
    column_indexes.extend(df._data.blocks[i].mgr_locs.as_array)
block_arrays = [df._data.blocks[i].values for i in len(df._data.blocks)]

some_cython_library.fill_dataframe_with_content(columns, column_indexes, block_arrays)

์ด๊ฒƒ์ด ๋‹น์‹ ์—๊ฒŒ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

concat ํ•˜์—ฌ copy=False ํ•˜๋ฉด ๋™์ผํ•œ dtype์„ ๊ฐ€์ง„ ์—ด์„ ๋ธ”๋ก์œผ๋กœ ๋ณ‘ํ•ฉํ•˜์ง€ ์•Š์ง€๋งŒ ๋ผ์ธ ์•„๋ž˜๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ์ด๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋ฏ€๋กœ ํ”ผํ•˜๋ ค๊ณ  ํ•˜๋Š” ๋ณต์‚ฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ํŒฌ๋”์˜ ๋‚ด๋ถ€ ๋™์ž‘์„ ์ž˜๋ชป ์ดํ•ดํ•œ ๊ฑธ๊นŒ์š”?

๋‚˜๋Š” ํฐ(์ฑ„์›Œ์ง€์ง€ ์•Š์€) ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์˜ ์ธ์Šคํ„ด์Šคํ™”๋กœ ์•ฝ๊ฐ„์˜ ์ง„์ „์„ ์ด๋ฃจ์—ˆ์ง€๋งŒ(ํŒฉํ„ฐ ~6.7) ์—ฌ์ „ํžˆ ์†๋„๊ฐ€ ๋น ๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ~ 90์˜ ๋˜ ๋‹ค๋ฅธ ์š”์†Œ ๋งŒ ๊ฐ€์•ผํ•ฉ๋‹ˆ๋‹ค ...

In [157]: a = np.empty(int(1e6), dtype=('i4,i4,f4,f4,f4,a10'))

In [158]: df = pd.DataFrame(a)

In [162]: %timeit np.empty(int(1e6), dtype=('i8,i4,i4,f4,f4,f4,a10'))
1000 loops, best of 3: 247 ยตs per loop

In [163]: %timeit allocate_like(df, size=int(1e6))
10 loops, best of 3: 22.4 ms per loop

In [164]: %timeit pd.DataFrame(np.empty(int(1e6), dtype=('i4,i4,f4,f4,f4,a10')))

10 loops, best of 3: 150 ms per loop

๋˜ ๋‹ค๋ฅธ ํฌ๋ง์€ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ํ†ตํ•ด ์†Œ๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž์ฃผ ์ฝ์„ ๋•Œ ๋™์ผํ•œ ๋ชจ์–‘์˜ DataFrame์„ ๋” ๋น ๋ฅด๊ฒŒ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ธ์Šคํ„ด์Šคํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์ง€๊ธˆ๊นŒ์ง€ ์ฃผ์š” ๋ชฉํ‘œ๋Š” ์•„๋‹ˆ์—ˆ์ง€๋งŒ ๋ฌด์‹ฌ์ฝ” ์ด๊ฒƒ์œผ๋กœ ๋” ๋‚˜์€ ์ง„์ „์„ ์ด๋ฃจ์—ˆ์Šต๋‹ˆ๋‹ค.

In [157]: a = np.empty(int(1e6), dtype=('i4,i4,f4,f4,f4,a10'))

In [158]: df = pd.DataFrame(a)

In [159]: %timeit np.empty(0, dtype=('i8,i4,i4,f4,f4,f4,a10'))
10000 loops, best of 3: 79.9 ยตs per loop

In [160]: %timeit allocate_like(df, size=0)
1000 loops, best of 3: 379 ยตs per loop

In [161]: %timeit pd.DataFrame(np.empty(0, dtype=('i4,i4,f4,f4,f4,a10')))
1000 loops, best of 3: 983 ยตs per loop

ํŽธ์ง‘ํ•˜๋‹ค

์œ„์˜ ํƒ€์ด๋ฐ์€ ์‚ฌ๊ณผ๋ฅผ ์˜ค๋ Œ์ง€์™€ ๋น„๊ตํ•  ๋•Œ ๋„ˆ๋ฌด ๋น„๊ด€์ ์ธ ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. numpy ๋ฌธ์ž์—ด ์—ด์€ ๊ณ ์ • ๊ธธ์ด ๊ธฐ๋ณธ ๋ฌธ์ž์—ด๋กœ ์ƒ์„ฑ๋˜๋Š” ๋ฐ˜๋ฉด pandas์˜ ํ•ด๋‹น ์—ด์€ ํŒŒ์ด์ฌ ๊ฐ์ฒด ๋ฐฐ์—ด๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์œ ์‚ฌํ•˜๊ฒŒ ๋น„๊ตํ•˜๋ฉด ์ธ์Šคํ„ด์Šคํ™” ์‹œ๊ฐ„์˜ ์•ฝ 92%๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ์ธ๋ฑ์Šค ์ƒ์„ฑ์„ ์ œ์™ธํ•˜๊ณ  DataFrame ์ธ์Šคํ„ด์Šคํ™”๋ฅผ numpy ์†๋„๋กœ ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค.

@ARF1 numpy ์†๋„๋ฅผ ์›ํ•˜๋ฉด numpy๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ์‹ค์ œ๋กœ ๋ฌด์—‡์„ํ•˜๊ณ  ์žˆ๋Š”์ง€ ๋˜๋Š” cython์—์„œ ๋ฌด์—‡์„ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ํ•ด๊ฒฐ์ฑ…์€ ๊ณ„์‚ฐ์„ ์ฒญํฌํ•˜๊ฑฐ๋‚˜ ๋‹จ์ผ dtypes๋ฅผ cython์— ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ๋” ํฐ ๊ธฐ๊ณ„๋ฅผ ์–ป๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

DataFrame์€ ๋ฐ์ดํ„ฐ๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ์กฐ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด numpy๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์€ ์ผ์„ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์ด ๊ทธ๋“ค๊ณผ ์‹ค์ œ๋กœ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๊ฑฐ์˜ ๋ชจ๋“  ํŒฌ๋” ์ž‘์—…์ด ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค. (๋Œ€๋ถ€๋ถ„์˜ numpy ์ž‘์—…๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ) ๋ฌด์—‡์„ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@jreback ํ˜„์žฌ numpy๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ ๊ตฌ์กฐํ™”๋œ ๋ฐฐ์—ด๋กœ๋งŒ (ํŽธ๋ฆฌํ•˜๊ฒŒ) ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํ˜ผํ•ฉ dtypes๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ตฌ์กฐํ™”๋œ ๋ฐฐ์—ด์€ ๋ณธ์งˆ์ ์œผ๋กœ ํ–‰ ์šฐ์„  ์ˆœ์„œ๋กœ ๋˜์–ด ์žˆ์–ด ์ผ๋ฐ˜์ ์ธ ๋ถ„์„ ์ฐจ์›๊ณผ ์ถฉ๋Œํ•˜์—ฌ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋ฉ๋‹ˆ๋‹ค. Pandas๋Š” ์—ด ์šฐ์„  ์ˆœ์œ„๋กœ ์ธํ•ด ์ž์—ฐ์Šค๋Ÿฌ์šด ๋Œ€์•ˆ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์ข‹์€ ์†๋„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์— ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋ฉด.

๋ฌผ๋ก  ๋Œ€์•ˆ์€ ๋‹ค๋ฅธ dtyped numpy ๋ฐฐ์—ด์˜ ์‚ฌ์ „์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ ์Šฌ๋ผ์ด์‹ฑ ๋“ฑ์ด ๋” ์ด์ƒ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ถ„์„์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ํ•ด๊ฒฐ์ฑ…์€ ๊ณ„์‚ฐ์„ ์ฒญํฌํ•˜๊ณ  ๋‹จ์ผ dtypes๋ฅผ cython์— ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋‚ด ์˜ˆ์—์„œ block_arrays ๋ณ€์ˆ˜๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค.

์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ ๋” ํฐ ๊ธฐ๊ณ„๋ฅผ ์‚ฌ์„ธ์š”.

100๋ฐฐ ์ด์ƒ ๋น ๋ฅธ ์†๋„๋Š” ์ €์—๊ฒŒ ์•ฝ๊ฐ„์˜ ์žฌ์ •์  ๋„์ „์ž…๋‹ˆ๋‹ค. ;-)

@ARF1 ์ž‘๋™ ๋ฐฉ์‹์— ๋Œ€ํ•œ ๋งค์šฐ ์ด์ƒํ•œ ๋ชจ๋ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ ์€ ์ˆ˜์˜ ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์„ ๋งŒ๋“  ๋‹ค์Œ ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ ์†๋„๋Š” ์‹ค์ œ ๊ณ„์‚ฐ์ด๋‚˜ ์กฐ์ž‘์˜ ์•„์ฃผ ์ž‘์€ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

@jreback : ์ด๊ฒƒ์€ ์ด์ƒํ•œ ๋ชจ๋ธ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ˆœ์ˆ˜ํ•œ ํŒŒ์ด์ฌ ๊ด€์ ์—์„œ ์‚ฌ๋ฌผ์„ ๋ณธ๋‹ค๋ฉด ์•„๋งˆ๋„ ์ด์ƒํ•œ ๋ชจ๋ธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. C++ ์ฝ”๋“œ๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒฝ์šฐ ํŒŒ์ด์ฌ ๊ฐ์ฒด๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ๊ธฐ์กด ํŒŒ์ด์ฌ ๊ฐ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์— ๋ฏผ๊ฐํ•œ ์ปจํ…์ŠคํŠธ์—์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ํŒŒ์ด์ฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ €๋ ดํ•˜๊ณ  ์•ˆ์ •์ ์ธ(๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜ ์ธก๋ฉด์—์„œ) ๋ฐฉ๋ฒ•์„ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŒฌ๋” ๊ฒŒ์‹œํŒ์—์„œ ์ด๋Ÿฌํ•œ ํƒœ๋„๊ฐ€ ์™œ ํ”ํ•œ์ง€ ์†”์งํžˆ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ํŒฌ๋”๊ฐ€ numpy๋ณด๋‹ค ๋†’์€ ์ˆ˜์ค€์˜ ๊ตฌ์„ฑ์ด๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๋Š” ํ•œ ๋ถˆํ–‰ํ•œ ์ผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ํŒฌ๋” "์œ„์—์„œ" ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์ด ์—ฌ์ „ํžˆ ๋” ์‰ฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. pandas DataFrame์€ ํ…Œ์ด๋ธ” ํ˜•์‹ ๋ฐ์ดํ„ฐ๋ฅผ python์œผ๋กœ ๋‚ด๋ณด๋‚ด๋ ค๋Š” C ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ž‘์—…ํ•˜๊ธฐ์— ๊ฐ€์žฅ ๋ฐ”๋žŒ์งํ•œ ์œ ํ˜•์ด๋ฏ€๋กœ ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ์ค‘์š”ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์“ฐ๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋ถ€์ •์ ์œผ๋กœ ๋ฐ›์•„๋“ค์ด์ง€ ๋งˆ์„ธ์š”. pandas DataFrames๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ํ›Œ๋ฅญํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๊ทธ๋ƒฅ numpy ๋ ˆ์ฝ”๋“œ๋‚˜ ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ๋๋‚ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ARF1 : ๊ถ๊ทน์ ์œผ๋กœ ์ด์œ ๋Š” ๊ธฐ์–ต๋‚˜์ง€ ์•Š์ง€๋งŒ ๋‚ด๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์„ ์€ Copy=False์ธ numpy ๋ฐฐ์—ด์—์„œ ๊ฐ ์ˆซ์ž ์œ ํ˜•์— ๋Œ€ํ•œ DataFrame์„ ๋งŒ๋“  ๋‹ค์Œ Copy=False์ธ pandas.concat์„ ๋‹ค์‹œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. numpy ๋ฐฐ์—ด์—์„œ ๋‹จ์ผ ์œ ํ˜• DataFrame์„ ๋งŒ๋“ค ๋•Œ numpy ๋ฐฐ์—ด์˜ ๋ฐฉํ–ฅ์— ๋งค์šฐ ์ฃผ์˜ํ•˜์‹ญ์‹œ์˜ค. ๋ฐฉํ–ฅ์ด ์ž˜๋ชป๋˜๋ฉด ๊ฐ ์—ด์— ํ•ด๋‹นํ•˜๋Š” numpy ๋ฐฐ์—ด์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค. pandas๋Š” ์ด๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ฒซ ๋ฒˆ์งธ ๊ธฐํšŒ์— ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. Categorical์€ ํ†ตํ•ฉ๋˜์ง€ ์•Š๊ณ  ๋‚˜๋จธ์ง€ ํ”„๋ ˆ์ž„์˜ ๋ณต์‚ฌ๋ณธ์„ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๋ฏ€๋กœ ๋์— Categorical์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ž‘์—…์„ ๋‹จ๊ณ„๋ณ„๋กœ ์ˆ˜ํ–‰ํ•˜๊ณ  (๊ธฐ๋ณธ numpy ๋ฐฐ์—ด์˜ array_interface ๋ฅผ ํ†ตํ•ด) ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์ง€์†์ ์œผ๋กœ ์žก๊ณ  ๋ณต์‚ฌ๋ณธ์ด ์‹ค์ œ๋กœ ์ƒ๋žต๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋™์ผํ•œ์ง€ ํ™•์ธํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋ณต์‚ฌ/์ธํ”Œ๋ ˆ์ด์Šค ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์กด์ค‘ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์€ ํŒฌ๋”์˜ ๋งค์šฐ ๋ถˆํ–‰ํ•œ ๊ฒฐ์ •์ž…๋‹ˆ๋‹ค. ์ฆ‰, DataFrame ์ƒ์„ฑ์ž์— ๋Œ€ํ•ด ์˜ˆ๋ฅผ ๋“ค์–ด copy=False๋กœ ์„ค์ •ํ•˜๋”๋ผ๋„ pandas๋Š” DataFrame์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•˜๋‹ค๊ณ  ๊ฒฐ์ •ํ•˜๋ฉด ์—ฌ์ „ํžˆ ๋ณต์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. pandas๊ฐ€ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์„ ๋•Œ ๋˜์ง€๋Š” ๋Œ€์‹  ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์€ ๋ณต์‚ฌ๋ณธ์„ ์ œ๊ฑฐํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋งค์šฐ ํ”ผ๊ณคํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ๊ทน๋„๋กœ ์ฒด๊ณ„์ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ™•์ธ์„ ์œ„ํ•ด ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์œผ๋ฉด ๋‚˜์ค‘์— ์‹ค์ˆ˜๋กœ ์ˆ˜์ •ํ•˜์—ฌ ๋ณต์‚ฌ๋ณธ์ด ๋งŒ๋“ค์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋Š” ์ž๋™์œผ๋กœ ๋ฐœ์ƒํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๋ง์น  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@quicknir ๊ทธ๋ ‡๊ฒŒ ๋งํ•˜๋ฉด. ์ตœ์ ํ™”๋ฅผ ์‹œ๋„ํ•˜๊ธฐ ์ „์— ๊ฐ„๋‹จํžˆ ํ”„๋กœํŒŒ์ผ๋งํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ „์— ๋งํ–ˆ๋“ฏ์ด, ๊ทธ๋ฆฌ๊ณ  prob๋Š” ๋‹ค์‹œ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฑด์„ค ์‹œ๊ฐ„์ด ๋ฌด์—‡์ด๋“  ์ง€๋ฐฐํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด DataFrame์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌผ๊ฑด์„ ๋ณด๊ด€ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์ฒ˜์Œ์— ์‚ฌ์šฉํ•˜๋Š” ์š”์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ง€๋ฐฐํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ฌด์—‡์ด ๋ฌธ์ œ์ธ๊ฐ€?

@jreback ์•„์ง ํ”„๋กœํŒŒ์ผ๋ง์„ ํ•˜์ง€ ์•Š์•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ๋‚˜๋Š” ๊ฐ€์ง€๊ณ ์žˆ๋‹ค. ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ํ˜•์‹์—์„œ ํ…Œ์ด๋ธ” ํ˜•์‹ ๋ฐ์ดํ„ฐ๋ฅผ ์—ญ์ง๋ ฌํ™”ํ•˜๋Š” C++ ๋ฐ Python ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ ์ฝ”๋“œ์— ์•ฝ๊ฐ„์˜ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ–ˆ์ง€๋งŒ ๋””์Šคํฌ ์ฝ๊ธฐ ์‹œ๊ฐ„์ด ์ง€๋ฐฐ์ ์ด์–ด์•ผ ํ•˜๋ฏ€๋กœ ์ฐจ์ด๊ฐ€ ์ž‘์•„์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ฐ€์„œ ์‚ฌ๋ณธ์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๊ทน๋„๋กœ ์ฃผ์˜ ๊นŠ๊ฒŒ ์žฌ์ž‘์—…ํ•˜๊ธฐ ์ „์—๋Š” ํŒŒ์ด์ฌ ๋ฒ„์ „์ด C++ ์ฝ”๋“œ์— ๋น„ํ•ด ๋‘ ๋ฐฐ๋‚˜ ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ฑฐ๋‚˜ ๋” ๋‚˜๋น ์กŒ๊ณ  ๊ฑฐ์˜ ๋ชจ๋“  ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ DataFrame์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ๋‚ด์šฉ์— ์ „ํ˜€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์€ ์•„์ฃผ ํฐ ํฌ๊ธฐ์˜ DataFrame์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ๋‚ด๊ฐ€ ๊ด€์‹ฌ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ , ์••์ถ• ํ•ด์ œํ•˜๊ณ , ํ•ด๋‹น DataFrame์— ์“ฐ๋Š” ๊ฒƒ๋งŒํผ ๋Œ€๋žต์ ์œผ๋กœ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋งค์šฐ ์—ด์•…ํ•œ ์„ฑ๋Šฅ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ํŠน์ • ์ž‘์—…์„ ์—ผ๋‘์— ๋‘๊ณ  ์ด ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ตœ์ข… ์‚ฌ์šฉ์ž์˜€๋‹ค๋ฉด ์•„๋งˆ๋„ ์ง€๋ฐฐ์ ์ด์ง€ ์•Š์€ ๊ตฌ์„ฑ์— ๋Œ€ํ•ด ๋ง์”€ํ•˜์‹  ๋‚ด์šฉ์ด ํƒ€๋‹นํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ €๋Š” ๊ฐœ๋ฐœ์ž์ด๊ณ  ์ด ์ฝ”๋“œ์˜ ์ตœ์ข… ์‚ฌ์šฉ์ž๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค์ด DataFrame์œผ๋กœ ๋ฌด์—‡์„ ํ•  ๊ฒƒ์ธ์ง€ ์ •ํ™•ํžˆ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. DataFrame์€ ๋””์Šคํฌ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ํ‘œํ˜„์„ ์–ป๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋””์Šคํฌ์˜ ๋ฐ์ดํ„ฐ๋กœ ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ์—ฌ์ „ํžˆ DataFrame ํ˜•์‹์„ ๊ฑฐ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋” ๋งŽ์€ ๋ฐฉ๋ฒ•(์˜ˆ: numpy ๊ตฌ๋ฌธ)์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ์—์„œ ๋ถ„๊ธฐ๊ฐ€ ํฌ๊ฒŒ ์ฆ๊ฐ€ํ•˜๊ณ  ๊ฐœ๋ฐœ์ž๋กœ์„œ ์ž‘์—…์ด ํ›จ์”ฌ ๋” ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค. DataFrames๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ๋Š๋ ค์•ผ ํ•˜๋Š” ๊ทผ๋ณธ์ ์ธ ์ด์œ ๊ฐ€ ์žˆ๋‹ค๋ฉด DataFrame, numpy ๋˜๋Š” ๋‘˜ ๋‹ค๋ฅผ ์ง€์›ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์ดํ•ดํ•˜๊ณ  ๊ฒฐ์ •ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ๋Š๋ ค์•ผ ํ•  ์ง„์งœ ์ด์œ ๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ ํŠœํ”Œ์— ์—ด ์ด๋ฆ„๊ณผ ์œ ํ˜•, ํ–‰ ์ˆ˜๊ฐ€ ํฌํ•จ๋œ ํŠœํ”Œ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” DataFrame.empty ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ๋งํ•˜๋Š” ์ง€์› ์‚ฌ์šฉ์ž์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์„ฑ์ž์˜ ์ฐจ์ด์ ์ž…๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ž์‹ ์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์„ฑ์ž ๋Œ€์‹  ์‚ฌ์šฉ์ž๋งŒ ์ง€์›ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ DataFrames์˜ ๋นˆ ํ• ๋‹น์€ ๋‚˜์™€ @ARF1 ๊ณผ ๊ฐ™์€ ์‚ฌ๋žŒ๋“ค์˜ ์‚ถ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด ์ค„ ํŒฌ๋”์˜ ๋‚ฎ์€ ๋งค๋‹ฌ๋ฆฐ ๊ณผ์ผ์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ท€์— ํ•ฉ๋‹นํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์นœ ๋ฌธ์„œํ™”๋œ ์†”๋ฃจ์…˜์„ ๊ฐ–๊ณ  ์‹ถ๋‹ค๋ฉด ๊ธ€์Ž„์š”. pandas์—๋Š” ๊ฝค ๋งŽ์€ ์‚ฌ์šฉ์ž/๊ฐœ๋ฐœ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด DataFrame์ด ๋งค์šฐ ๋‹ค์žฌ๋‹ค๋Šฅํ•œ ์ด์œ ์ด๋ฉฐ ๋งŽ์€ ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ ๋ฐ ์ถ”๋ก ์ด ํ•„์š”ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ์ด์œ ์ž…๋‹ˆ๋‹ค. ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ํ• ์• ํ•  ์˜ํ–ฅ์ด ์žˆ์ง€๋งŒ, ๋ช‡๋ช‡ ํŒ๋‹ค ๊ฐœ๋ฐœ์ž๋“ค๋กœ๋ถ€ํ„ฐ ๋””์ž์ธ์— ๋Œ€ํ•œ ํ•ฉ๋ฆฌ์ ์ธ ํ•ฉ์˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ œ์ถœํ•˜๊ณ  ์‚ฌ๋žŒ๋“ค์ด ๋ณ€๊ฒฝํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ํŠน์ • ์‚ฌํ•ญ์ด ์žˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ๋ฉ‹์ง„ ์ผ์ž…๋‹ˆ๋‹ค. ๋˜๋Š” 10์‹œ๊ฐ„์„ ํˆฌ์žํ•œ ํ›„์— ๊น”๋”ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†๊ณ  ์‚ฌ๋žŒ๋“ค์ด ๋ถˆ์พŒํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ๋Š”๋‹ค๋ฉด ๊ทธ๊ฒƒ๋„ ์ข‹์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚˜๋Š” X์‹œ๊ฐ„์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ๋ณ„๋กœ ์ข‹์ง€ ์•Š๊ณ  ์ด๊ฒƒ์ด ๊ทธ๋‹ค์ง€ ์œ ์šฉํ•˜์ง€ ์•Š๋‹ค๋Š” ๋ง์„ ๋“ฃ๊ณ  ๊ตฌํ˜„์ด ์ง€์ €๋ถ„ํ•˜๊ณ  ์‹ค์ œ๋กœ ์ •๋ฆฌํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด ๊ฐ์ •๊ณผ๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ€๊ณ  ์ด์ „์— OSS ํ”„๋กœ์ ํŠธ์— ํฐ ๊ธฐ์—ฌ๋ฅผ ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๋‚ด ์ดˆ๊ธฐ ๊ฒŒ์‹œ๋ฌผ์—์„œ ๋ฐ”๋กœ ์ด๊ฒƒ์„ ์ œ์•ˆํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๊ณ  ์†”์งํžˆ ๋งํ•ด์„œ ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํŒ๋‹ค์˜ "๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฌ๋‹ค"๋Š” ์ธ์ƒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ด๊ณ  ๊ฐ€๋Šฅํ•œ ํ•œ ๊ตฌ์ฒด์ ์ธ ๋””์ž์ธ ์ œ์•ˆ์„ ๋งŒ๋“ค๊ณ  ํ”ผ๋“œ๋ฐฑ/์ž ์ • ์Šน์ธ์ด ์žˆ์œผ๋ฉด ๊ฐ€๋Šฅํ•œ ํ•œ ์ž‘์—…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@quicknir ์˜ ํ•ต์‹ฌ์€ ๋งค์šฐ ํฌ๊ด„์ ์ธ ์ „์ฒด ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ฅผ ํ†ต๊ณผํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํŒฌ๋”์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ API๋Š” ๋‹ค์†Œ ์‚ฌ์šฉ์ž ์นœํ™”์ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์™œ ์‹ซ์–ดํ–ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์–ด

concat(list_of_arrays,axis=1,copy=False) ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‹น์‹ ์ด ์›ํ•˜๋Š” ๊ฒƒ์„ ์ •ํ™•ํžˆ ์ˆ˜ํ–‰ํ•œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค(๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋‹น์‹ ์ด ์‹ค์ œ๋กœ ์›ํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค).

๋น„์Šทํ•œ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ๊ฐ๊ฐ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๋‹จ์ผ numpy ๋ฐฐ์—ด์—์„œ ์ƒ์„ฑ๋œ DataFrames ๋ชฉ๋ก์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์šฐ์„ , ์ด ๊ธฐ์ˆ ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์—ฌ์ „ํžˆ ์ผ๋ถ€ ์‚ฌ๋ณธ์„ ๋งŒ๋‚œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด pandas๋Š” ํ•ญ์ƒ copy=False๋ฅผ ์กด์ค‘ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ฝ”๋“œ๊ฐ€ ์‹ค์ œ๋กœ ๋ณต์‚ฌ๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ํ”ผ๊ณคํ•ฉ๋‹ˆ๋‹ค. pandas 17์˜ ๊ฒฝ์šฐ ๊ฐœ๋ฐœ์ž๊ฐ€ copy=True๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ ๋‹ค์Œ ๋ณต์‚ฌ๋ณธ์„ ์ƒ๋žตํ•  ์ˆ˜ ์—†์„ ๋•Œ copy=False๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ๋ฅผ ์ง„์‹ฌ์œผ๋กœ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์–ด์จŒ๋“ .

๋‘˜์งธ, ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ๋‚˜์ค‘์— ์—ด์„ ์žฌ์ •๋ ฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋†€๋ผ์šธ ์ •๋„๋กœ ์–ด์ƒ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ์›๋ž˜ ์›ํ•˜๋Š” ์ตœ์ข… ์ˆœ์„œ๋กœ ์ •๋ ฌ๋œ ์—ด ์ด๋ฆ„์„ ์ •์ˆ˜๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ œ์ž๋ฆฌ์—์„œ ์ธ๋ฑ์Šค ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์—ด ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

์…‹์งธ, ํƒ€์ž„์Šคํƒฌํ”„ ์œ ํ˜•(numpy datetime64)์— ๋Œ€ํ•ด ์‚ฌ๋ณธ์ด ๋ถˆ๊ฐ€ํ”ผํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ์ฝ”๋“œ๋Š” ์–ผ๋งˆ ์ „์— ์ž‘์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์Œ์— ์ƒˆ๋กญ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์‹ค์ˆ˜ํ–ˆ์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๊ฝค ์‹ ์ค‘ํ•˜๊ฒŒ ๊ฒ€ํ† ํ–ˆ๊ณ  ๊ทธ๊ฒƒ์ด ๋‹น์‹œ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•ด ๋‚ธ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

์œ„์—์„œ ์ œ๊ณตํ•œ ์ฝ”๋“œ๋Š” numpy ๋ฐฐ์—ด์—์„œ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ํ•จ๊ป˜ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. TypeError: ๋น„ NDFrame ๊ฐœ์ฒด๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋จผ์ € DataFrame์œผ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ์—ฌ๊ธฐ ๋˜๋Š” ์œ„์—์„œ ์ œ๊ณตํ•œ ์†”๋ฃจ์…˜์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•„์ง ์ž‘๋™ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๊ฒƒ์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

@quicknir ์œ„์˜ ์˜ˆ๋Š” ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. pls๋Š” ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ œ๊ณตํ•˜๊ณ  ๋„์™€๋“œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

pd.concat([np.zeros((2,2))], ์ถ•=1, ๋ณต์‚ฌ=๊ฑฐ์ง“)

์ €๋Š” ํŒฌ๋” 0.15.2๋ฅผ ์‚ฌ์šฉ ์ค‘์ด๋ฏ€๋กœ ์•„๋งˆ๋„ 0.16์—์„œ ์ž‘๋™ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๊นŒ?

pls๋Š” pd.concat ์˜ ๋ฌธ์„œ ๋ฌธ์ž์—ด์„ ์ฝ์Šต๋‹ˆ๋‹ค. DataFrame ๋ฅผ ํ†ต๊ณผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

btw copy=True ๋Š” ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค.

๋งž์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์“ด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ„์—์„œ ์ž‘์„ฑํ•œ ์ฝ”๋“œ ์กฐ๊ฐ์—๋Š” list_of_dataframes๊ฐ€ ์•„๋‹ˆ๋ผ list_of_arrays๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์šฐ๋ฆฌ๋Š” ์„œ๋กœ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฒฐ๊ตญ pd.concat ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์ง€๋งŒ ๊ฝค ์‚ฌ์†Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

1) DataFrames์˜ ๋ชฉ๋ก์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ DataFrame์—๋Š” ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ๊ณ ์œ ํ•œ dtype์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋ชจ๋“  ๋‹ค๋ฅธ dtypes๋ฅผ ์ˆ˜์ง‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2) ๊ฐ DataFrame์€ ์›ํ•˜๋Š” dtype, ๋™์ผํ•œ ์ˆ˜์˜ ํ–‰, ์›ํ•˜๋Š” ์ˆ˜์˜ ์—ด ๋ฐ order = 'F' ํ”Œ๋ž˜๊ทธ์˜ ๋‹จ์ผ numpy ๋ฐฐ์—ด์—์„œ ์ƒ์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. order='C'(๊ธฐ๋ณธ๊ฐ’)์ด๋ฉด pandas๋Š” ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ณต์‚ฌํ•˜์ง€ ์•Š์„ ๋•Œ ์ข…์ข… ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

3) ๋ฌด์‹œ 1) Categoricals์˜ ๊ฒฝ์šฐ ๋‚˜์ค‘์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ธ”๋ก์œผ๋กœ ๋ณ‘ํ•ฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

4) ๋ชจ๋“  ๊ฐœ๋ณ„ DataFrame์„ ์ƒ์„ฑํ•  ๋•Œ ์—ด์€ ์›ํ•˜๋Š” ์ˆœ์„œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ณต์‚ฌ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š๊ณ  ์—ด ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•  ๋ฐฉ๋ฒ•์ด ์—†์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5) DataFrames ๋ชฉ๋ก์„ ๋งŒ๋“  ํ›„ concat์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ณต์‚ฌ๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ copy=False๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  ์กฐ์šฉํžˆ ๋ณต์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ฌด ๊ฒƒ๋„ ์—‰๋ง์œผ๋กœ ๋งŒ๋“ค์ง€ ์•Š์•˜๋Š”์ง€ ์—ด์‹ฌํžˆ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

6) ์›ํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ์—ด ์ธ๋ฑ์Šค๋ฅผ ์ •๋ ฌํ•œ ๋‹ค์Œ ์—ด์˜ ์ด๋ฆ„์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

์ด ์ ˆ์ฐจ๋ฅผ ์—„๊ฒฉํ•˜๊ฒŒ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๋ผ์ด๋„ˆ๊ฐ€ ์•„๋‹ˆ๊ณ  ์‹ค์ˆ˜ํ•  ๊ณณ์ด ๋งŽ๊ณ  ์—ฌ์ „ํžˆ ํƒ€์ž„์Šคํƒฌํ”„์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ์œผ๋กœ์จ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋Š” ๋ถˆํ•„์š”ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์›ํ•œ๋‹ค๋ฉด ๊ณต๊ฐœ API๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ์ด ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€ ์ดˆ์•ˆ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์ด ์‹ค์ œ๋กœ ์‚ฌ๋ณธ์„ ์ƒ๋žตํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ํ…Œ์ŠคํŠธ์™€ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ copy=False๋Š” DataFrame ์ƒ์„ฑ์ž์˜ ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค. ๋‚ด ์š”์ ์€ ์ธ์ˆ˜๋ฅผ ์กด์ค‘ํ•  ์ˆ˜ ์—†๋Š” ํ•จ์ˆ˜๊ฐ€ "ํ•ฉ๋ฆฌ์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰"ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋˜์ ธ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, copy=False๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ์ž…๋ ฅ์„ ๋ณ€๊ฒฝํ•ด์•ผ ๋ณต์‚ฌ ์ƒ๋žต์ด ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ๋ณต์‚ฌ๋ฅผ True๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•จ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. copy=False์ผ ๋•Œ ๋ณต์‚ฌ๊ฐ€ ์ž๋™์œผ๋กœ ๋ฐœ์ƒํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์„ฑ๋Šฅ์— ๋ฏผ๊ฐํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„๊ทธ๋ฅผ ์ฐพ๋Š” ๋ฐ ๋” ๋†€๋ž๊ณ  ๋œ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋‹จ๊ณ„๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
pls๋Š” ์œ„์—์„œ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์‹ค์ œ ์˜ˆ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

numpy ๋ทฐ๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ ํ˜•ํƒœ ๋ณ€๊ฒฝ ์ž‘์—…(๋•Œ๋กœ๋Š”)์œผ๋กœ ๋ณต์‚ฌ๋ณธ์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๊ณ  ๋‹ค๋ฅธ ๊ฒƒ์€ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ˆœํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ์„ฑ๋Šฅ ์ฝ”๋“œ์˜ ๋ชฉ์ ์„ ์ •์˜์ ์œผ๋กœ ๋ฌดํšจํ™”ํ•˜๋Š” ๋งŽ์€ ๋‚ด์„ฑ ์—†์ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์‚ฌ์— ๋Œ€ํ•œ ์†Œํ”„ํŠธ ๋ณด์ฆ๋งŒ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

DataFrame ๊ตฌ์„ฑ์—์„œ copy=False ์˜ ๋™์ž‘์€ numpy์˜ np.array ํ•จ์ˆ˜์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ๋ฐฐ์—ด ๋ชฉ๋ก์„ ์ œ๊ณตํ•˜๋ฉด ์ตœ์ข… ๋ฐ์ดํ„ฐ๋Š” ํ•ญ์ƒ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค).

์ด๊ฒƒ์€ ํŒฌ๋”์˜ ๋ถˆํ–‰ํ•œ ๊ธฐ๋Šฅ ๊ฒฉ์ฐจ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. IMHO, ์šฐ๋ฆฌ๋Š” ํ˜„์žฌ ํŒ๋‹ค ๋‚ด๋ถ€ ๋ชจ๋ธ(๋ธ”๋ก์„ ํ†ตํ•ฉํ•˜๋Š”)๋กœ๋Š” ๋งŒ์กฑ์Šค๋Ÿฌ์šด ์†”๋ฃจ์…˜์„ ๊ฒฐ์ฝ” ๊ฐ€์งˆ ์ˆ˜ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„, ๊ทธ๊ฒƒ์€ ํŒฌ๋”๋ฅผ ์œ„ํ•œ ์˜ต์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํŒฌ๋”๋Š” ์—ฌ์ „ํžˆ ๋งŽ์€ ์—ด๋กœ DataFrame์„ ๋งŒ๋“œ๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ์ž‘๋™ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์—๊ฒŒ ํ•„์š”ํ•œ ๊ฒƒ์€ ๊ฐ ์—ด์„ 1D numpy ๋ฐฐ์—ด๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ์ €์žฅํ•˜๋Š” ๊น”๋”ํ•œ ๋ฐ์ดํ„ฐ ์ž‘์—…์„ ์œ„ํ•ด ํŠน๋ณ„ํžˆ ์„ค๊ณ„๋œ ๋Œ€์ฒด DataFrame ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์—ด์„ N์ฐจ์› ๋ฐฐ์—ด๋กœ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” xray ์˜ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๊ณผ ์‹ค์ œ๋กœ ๋‹ค์†Œ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊ณต๊ฐ„๋งŒ ํ• ๋‹นํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๊ณ ์„ฑ๋Šฅ pandas ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„ ์ƒ์„ฑ์ž๋Š” ์ง€์›ํ•ด์•ผ ํ•˜๋Š” ๋‹ค์–‘ํ•œ ์—ด ์œ ํ˜•์„ ๊ณ ๋ คํ•  ๋•Œ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฆ‰, pandas ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์„ ๊ณ ์„ฑ๋Šฅ ๋ฐ์ดํ„ฐ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์š”ํ•œ ์—ด ์œ ํ˜•์œผ๋กœ ์ œํ•œ๋œ ํ• ๋‹น ์ „์šฉ ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„ ์ƒ์„ฑ์ž๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์„ฑ์ž์—๊ฒŒ๋Š” ์ƒ๋‹นํžˆ ๊ฐ„๋‹จํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ ์„ธ๊ทธ๋จผํŠธ๋Š” ์˜๊ฐ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฑฐ์˜ numpy ์†๋„๋กœ ์ฑ„์›Œ์ง€์ง€ ์•Š์€ ํ• ๋‹น ์ „์šฉ ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์„ ์ธ์Šคํ„ด์Šคํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ์—๋Š” PR #9977์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

import numpy as np
from pandas.core.index import _ensure_index
from pandas.core.internals import BlockManager
from pandas.core.generic import NDFrame
from pandas.core.frame import DataFrame
from pandas.core.common import CategoricalDtype
from pandas.core.categorical import Categorical
from pandas.core.index import RangeIndex

def allocate_like(df, size, keep_categories=False):
    # define axes (uses PR #9977)
    axes = [df.columns.values.tolist(), RangeIndex(size)]

    # allocate and create blocks
    blocks = []
    for block in df._data.blocks:
        # special treatment for non-ordinary block types
        if isinstance(block.dtype, CategoricalDtype):
            if keep_categories:
                categories = block.values.categories
            else:
                categories = Index([])
            values = Categorical(values=np.empty(shape=block.values.shape,
                                                 dtype=block.values.codes.dtype),
                                 categories=categories,
                                 fastpath=True)
        # ordinary block types
        else:
            new_shape = (block.values.shape[0], size)
            values = np.empty(shape=new_shape, dtype=block.dtype)

        new_block = block.make_block_same_class(values=values,
                                                placement=block.mgr_locs.as_array)
        blocks.append(new_block)

    # create block manager
    mgr = BlockManager(blocks, axes)

    # create dataframe
    return DataFrame(mgr)

์˜ˆ์ œ ์ƒ์„ฑ์ž allocate_like() ํ•˜๋ฉด ์„ฑ๋Šฅ ํŒจ๋„ํ‹ฐ cf numpy๋Š” ํฐ ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ x2.3(์ผ๋ฐ˜์ ์œผ๋กœ x333)์ด๊ณ  ํฌ๊ธฐ๊ฐ€ 0์ธ ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ x3.3(์ผ๋ฐ˜์ ์œผ๋กœ x8.9)์ž…๋‹ˆ๋‹ค.

In [2]: import numpy as np

In [3]: import pandas as pd

In [4]: a = np.empty(int(1e6), dtype=('i4,i4,f4,f4,f4'))

# create template-dataframe
In [5]: df = pd.DataFrame(a)

# large dataframe timings
In [6]: %timeit np.empty(int(1e6), dtype=('i4,i4,f4,f4,f4'))
1000 loops, best of 3: 212 ยตs per loop

In [7]: %timeit allocate_like(df, size=int(1e6))
1000 loops, best of 3: 496 ยตs per loop

In [8]: %timeit pd.DataFrame(np.empty(int(1e6), dtype=('i4,i4,f4,f4,f4')))
10 loops, best of 3: 70.6 ms per loop

# zero-size dataframe timing
In [9]: %timeit np.empty(0, dtype=('i4,i4,f4,f4,f4'))
10000 loops, best of 3: 108 ยตs per loop

In [10]: %timeit allocate_like(df, size=0)
1000 loops, best of 3: 360 ยตs per loop

In [11]: %timeit pd.DataFrame(np.empty(0, dtype=('i4,i4,f4,f4,f4')))
1000 loops, best of 3: 959 ยตs per loop

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ž ์‹œ ๋™์•ˆ ์ด ์ •๋ณด๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. @ARF1 , ์œ„์˜ ์ฝ”๋“œ ์ƒ˜ํ”Œ์— ๋Œ€ํ•ด ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๋Šฅ ์ง€ํ‘œ์™€ ํ•จ๊ป˜ ๋งค์šฐ ์ข‹์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์—†์ด DataFrame์˜ ๋ ˆ์ด์•„์›ƒ์— ํ•ด๋‹นํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๋ฉด ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๋” ์ž์—ฐ์Šค๋Ÿฝ๊ณ  ์„ฑ๋Šฅ๋„ ํ–ฅ์ƒ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ํด๋ž˜์Šค๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด ํ–‰์˜ ์žฌ์ธ๋ฑ์‹ฑ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์€ dtypes, ์—ด ์ด๋ฆ„ ๋ฐ ์—ด ์ˆœ์„œ๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” DataFrameLayout์ด๋ผ๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, dtype์—์„œ ์—ด ๋ฒˆํ˜ธ(์ˆœ์„œ์šฉ)๊นŒ์ง€์˜ ์‚ฌ์ „๊ณผ ๋ชจ๋“  ์ด๋ฆ„์ด ํฌํ•จ๋œ ๋ณ„๋„์˜ ๋ฐฐ์—ด์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ ˆ์ด์•„์›ƒ์—์„œ dict์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•˜๊ณ  ์šฐ์•„ํ•œ ๋ฐ˜๋ณต์„ ํ†ตํ•ด ๋ธ”๋ก ๊ด€๋ฆฌ์ž๋ฅผ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด ํด๋ž˜์Šค๋Š” ๋นˆ ์ƒ์„ฑ์ž์™€ ๊ฐ™์€ ์œ„์น˜ ๋˜๋Š” ์žฌ์ธ๋ฑ์‹ฑ ์ž‘์—…์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ์—๋Š” ์ด๋Ÿฌํ•œ ์ถ”์ƒํ™”๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์˜๋ฏธ์—์„œ DataFrame์€ ๋ณตํ•ฉ ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด๊ณ  DataFrameLayout์€ ๊ตฌ์„ฑ์˜ ์ •ํ™•ํ•œ ํŠน์„ฑ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ๋‚˜๋Š” ๋น„์Šทํ•œ ๊ฒƒ์ด ๋ฒ”์ฃผํ˜•์— ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ฒ”์ฃผ, ์ •๋ ฌ ์—ฌ๋ถ€, ์ง€์› ๋ฐฐ์—ด ์œ ํ˜• ๋“ฑ์„ ์ €์žฅํ•˜๋Š” CategoricalType ์ถ”์ƒํ™”๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ DataFrameLayout์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ๋•Œ ๋ชจ๋“  ์—ด์—๋Š” ์™„์ „ํžˆ ์ง€์ •๋œ ์œ ํ˜•์ด ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ์ด๋Š” ํ˜„์žฌ Categoricals์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ์•Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์€ ์ด ๋‘ ๋ถ€๋ฅ˜์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

@quicknir ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ CategoricalDtype ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค -- ๊ท€ํ•˜๊ฐ€ ์„ค๋ช…ํ•˜๋Š” ์ „์ฒด CategoricalType ๋กœ ํ™•์žฅ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” DataFrameLayout ํด๋ž˜์Šค์— ๋Œ€ํ•ด ์™„์ „ํžˆ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์— ๋Œ€ํ•ด ๋” ๊ฐ„๋‹จํ•œ ๋Œ€์•ˆ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(R ๋˜๋Š” Julia์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ๋ฐฉ์‹๊ณผ ๋” ์œ ์‚ฌํ•จ). ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์ผ์— ์•ฝ๊ฐ„์˜ ๊ด€์‹ฌ์ด ์žˆ๊ณ  ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ฒฐ๊ตญ ์–ด๋–ค ํ˜•ํƒœ๋กœ๋“  ์ผ์–ด๋‚  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์•„๋งˆ๋„ ์กฐ๋งŒ๊ฐ„ (๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ ํŒ๋‹ค ํ”„๋กœ์ ํŠธ์˜ ์ผ๋ถ€๋กœ) ์ผ์–ด๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@quicknir ์˜ˆ , DataFrameLayout ๋Š” ์—ฌ๊ธฐ์„œ ๋ฐ”ํ€ด๋ฅผ ์žฌ๋ฐœ๋ช…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ dtype ์‚ฌ์–‘์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด

In [14]: tm.makeMixedDataFrame().to_records().dtype
Out[14]: dtype([('index', '<i8'), ('A', '<f8'), ('B', '<f8'), ('C', 'O'), ('D', '<M8[ns]')])

@jreback dtype ์‚ฌ์–‘์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์ฃผ์š” ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋ฐ”ํ€ด๋ฅผ ์žฌ๋ฐœ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

1) ๋‚ด๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํ•œ to_records()๋Š” ์ „์ฒด DataFrame์˜ ์ „์ฒด ๋ณต์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. DataFrame์— ๋Œ€ํ•œ ์‚ฌ์–‘(์ง€๊ธˆ๋ถ€ํ„ฐ ์ด ์šฉ์–ด๋งŒ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค)์„ ์–ป๋Š” ๊ฒƒ์€ ์ €๋ ดํ•˜๊ณ  ์‰ฌ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2) to_records์˜ ์ถœ๋ ฅ์€ numpy ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์˜ ์˜๋ฏธ ์ค‘ ํ•˜๋‚˜๋Š” ์ด๊ฒƒ์ด Categoricals๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์ง€์›ํ•˜๋„๋ก ํ™•์žฅ๋  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

3) ์‚ฌ์–‘์„ ๋‚ด๋ถ€์ ์œผ๋กœ ์ €์žฅํ•˜๋Š” ์ด ๋ฐฉ๋ฒ•์€ ๋ฐ์ดํ„ฐ๊ฐ€ DataFrame ๋‚ด๋ถ€์— ์ €์žฅ๋˜๋Š” ๋ฐฉ์‹(์˜ˆ: dtype๊ณผ ๊ฐ™์€ ๋ธ”๋ก)๊ณผ ์‰ฝ๊ฒŒ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‚ฌ์–‘์—์„œ ๋ธ”๋ก์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด dtype์—์„œ ์—ด ๋ฒˆํ˜ธ๋กœ์˜ ์‚ฌ์ „์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด๊ฐ€ ์ œ์•ˆํ•œ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์–‘์„ ์ €์žฅํ•˜์—ฌ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ์ถ”๊ฐ€ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. 2000๊ฐœ์˜ ์—ด์ด ์žˆ๋Š” DataFrame์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋น„์šฉ์ด ๋งŽ์ด ๋“ญ๋‹ˆ๋‹ค.

์š”์ปจ๋Œ€, ๋ ˆ์ฝ”๋“œ ํ‘œํ˜„์˜ dtype์€ ์ ์ ˆํ•œ ์‚ฌ์–‘์˜ ๋ถ€์กฑ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ฃผ์š” ๊ธฐ๋Šฅ์ด ๋ถ€์กฑํ•˜๊ณ  ์„ฑ๋Šฅ์ด ํ›จ์”ฌ ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.

SO์—๋Š” ์ด ๊ธฐ๋Šฅ์„ ์š”๊ตฌํ•˜๋Š” ๋งŽ์€ ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๋ฌธ์ œ๋Š” ๊ฐœ๋ณ„ ์—ด์„ ๋‹จ์ผ ๋ฉ”๋ชจ๋ฆฌ ์ฒญํฌ('๋ธ”๋ก')๋กœ ํ†ตํ•ฉํ•˜๋Š” BlockManager์—์„œ ๋น„๋กฏ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
copy=False๊ฐ€ ์ง€์ •๋œ ๊ฒฝ์šฐ ๊ฐ€์žฅ ์‰ฌ์šด ์ˆ˜์ •์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ธ”๋ก์œผ๋กœ ํ†ตํ•ฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋น„ ํ†ตํ•ฉ ์›์ˆญ์ด ํŒจ์น˜ BlockManager๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
https://stackoverflow.com/questions/45943160/can-memmap-pandas-series-what-about-a-dataframe
์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

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