๋ช ์๊ฐ ๋์ ๋จธ๋ฆฌ๋ฅผ ์ฐข์ ํ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ์ง ์๊ณ ํผํฉ 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์ ์ ํ ์ง์ฅ์ ์ฃผ์ง ์์ต๋๋ค.
์ธ๋ฑ์ค์ ์ด์ด ์๋ ๋น ํ๋ ์์ ๊ฐ๋จํ ๋ง๋ค ์ ์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ 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 ๋ฌธ์ .
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
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์ฌ์ฉํ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
SO์๋ ์ด ๊ธฐ๋ฅ์ ์๊ตฌํ๋ ๋ง์ ์ค๋ ๋๊ฐ ์์ต๋๋ค.
์ด ๋ชจ๋ ๋ฌธ์ ๋ ๊ฐ๋ณ ์ด์ ๋จ์ผ ๋ฉ๋ชจ๋ฆฌ ์ฒญํฌ('๋ธ๋ก')๋ก ํตํฉํ๋ BlockManager์์ ๋น๋กฏ๋ ๊ฒ ๊ฐ์ต๋๋ค.
copy=False๊ฐ ์ง์ ๋ ๊ฒฝ์ฐ ๊ฐ์ฅ ์ฌ์ด ์์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ธ๋ก์ผ๋ก ํตํฉํ์ง ์๋ ๊ฒ์ ๋๋ค.
๋น ํตํฉ ์์ญ์ด ํจ์น BlockManager๊ฐ ์์ต๋๋ค.
https://stackoverflow.com/questions/45943160/can-memmap-pandas-series-what-about-a-dataframe
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์ฌ์ฉํ์ต๋๋ค.