TypeError: Cannot serialize the column [date] because its data contents are [empty] object dtype.수백만 행이있는 디스크상의 테이블 병합과 관련된 문제
안녕하세요! 현재 각각 하나의 노드가 포함 된 두 개의 대형 HDFStore가 있는데 두 노드가 모두 메모리에 맞지 않습니다. 노드에는 NaN 값이 포함되어 있지 않습니다. 이제 this을 사용하여이 두 노드를 병합하고 싶습니다. 처음에는 모든 데이터가 하나의 청크에 들어 맞고 이것이 정상적으로 작동하는 작은 저장소에 대해 테스트되었습니다. 하지만 이제 청크를 청크로 병합해야하는 경우에 다음과 같은 오류가 발생합니다 : TypeError: Cannot serialize the column [date], because its data contents are [empty] object dtype
.
이것은 내가 실행중인 코드입니다. 내가 눈치
>>> import pandas as pd
>>> from pandas import HDFStore
>>> print pd.__version__
0.12.0rc1
>>> h5_1 ='I:/Data/output/test8\\var1.h5'
>>> h5_3 ='I:/Data/output/test8\\var3.h5'
>>> h5_1temp = h5_1.replace('.h5','temp.h5')
>>> A = HDFStore(h5_1)
>>> B = HDFStore(h5_3)
>>> Atemp = HDFStore(h5_1temp)
>>> print A
<class 'pandas.io.pytables.HDFStore'>
File path: I:/Data/output/test8\var1.h5
/var1 frame_table (shape->12626172)
>>> print B
<class 'pandas.io.pytables.HDFStore'>
File path: I:/Data/output/test8\var3.h5
/var3 frame_table (shape->6313086)
>>> nrows_a = A.get_storer('var1').nrows
>>> nrows_b = B.get_storer('var3').nrows
>>> a_chunk_size = 500000
>>> b_chunk_size = 500000
>>> for a in xrange(int(nrows_a/a_chunk_size) + 1):
... a_start_i = a * a_chunk_size
... a_stop_i = min((a + 1) * a_chunk_size, nrows_a)
... a = A.select('var1', start = a_start_i, stop = a_stop_i)
... for b in xrange(int(nrows_b/b_chunk_size) + 1):
... b_start_i = b * b_chunk_size
... b_stop_i = min((b + 1) * b_chunk_size, nrows_b)
... b = B.select('var3', start = b_start_i, stop = b_stop_i)
... Atemp.append('mergev13', pd.merge(a, b , left_index=True, right_index=True,how='inner'))
...
Traceback (most recent call last):
File "<interactive input>", line 9, in <module>
File "D:\Python27\lib\site-packages\pandas\io\pytables.py", line 658, in append
self._write_to_group(key, value, table=True, append=True, **kwargs)
File "D:\Python27\lib\site-packages\pandas\io\pytables.py", line 923, in _write_to_group
s.write(obj = value, append=append, complib=complib, **kwargs)
File "D:\Python27\lib\site-packages\pandas\io\pytables.py", line 3251, in write
return super(AppendableMultiFrameTable, self).write(obj=obj.reset_index(), data_columns=data_columns, **kwargs)
File "D:\Python27\lib\site-packages\pandas\io\pytables.py", line 2983, in write
**kwargs)
File "D:\Python27\lib\site-packages\pandas\io\pytables.py", line 2715, in create_axes
raise e
TypeError: Cannot serialize the column [date] because
its data contents are [empty] object dtype
것들, 내가 pandas_version에있어 것을 언급 = '0.10.1'그러나 내 팬더 버전이 0.12.0rc1입니다. 더 나아가 좀 더 구체적인 노드 정보 : Atemp에서 chunksize 영역부터
>>> A.select_column('var1','date').unique()
array([2006001, 2006009, 2006017, 2006025, 2006033, 2006041, 2006049,
2006057, 2006065, 2006073, 2006081, 2006089, 2006097, 2006105,
2006113, 2006121, 2006129, 2006137, 2006145, 2006153, 2006161,
2006169, 2006177, 2006185, 2006193, 2006201, 2006209, 2006217,
2006225, 2006233, 2006241, 2006249, 2006257, 2006265, 2006273,
2006281, 2006289, 2006297, 2006305, 2006313, 2006321, 2006329,
2006337, 2006345, 2006353, 2006361], dtype=int64)
>>> B.select_column('var3','date').unique()
array([2006001, 2006017, 2006033, 2006049, 2006065, 2006081, 2006097,
2006113, 2006129, 2006145, 2006161, 2006177, 2006193, 2006209,
2006225, 2006241, 2006257, 2006273, 2006289, 2006305, 2006321,
2006337, 2006353], dtype=int64)
>>> A.get_storer('var1').levels
['x', 'y', 'date']
>>> A.get_storer('var1').attrs
/var1._v_attrs (AttributeSet), 12 attributes:
[CLASS := 'GROUP',
TITLE := '',
VERSION := '1.0',
data_columns := ['date', 'y', 'x'],
index_cols := [(0, 'index')],
levels := ['x', 'y', 'date'],
nan_rep := 'nan',
non_index_axes := [(1, ['x', 'y', 'date', 'var1'])],
pandas_type := 'frame_table',
pandas_version := '0.10.1',
table_type := 'appendable_multiframe',
values_cols := ['values_block_0', 'date', 'y', 'x']]
>>> A.get_storer('var1').table
/var1/table (Table(12626172,)) ''
description := {
"index": Int64Col(shape=(), dflt=0, pos=0),
"values_block_0": Float64Col(shape=(1,), dflt=0.0, pos=1),
"date": Int64Col(shape=(), dflt=0, pos=2),
"y": Int64Col(shape=(), dflt=0, pos=3),
"x": Int64Col(shape=(), dflt=0, pos=4)}
byteorder := 'little'
chunkshape := (3276,)
autoIndex := True
colindexes := {
"date": Index(6, medium, shuffle, zlib(1)).is_CSI=False,
"index": Index(6, medium, shuffle, zlib(1)).is_CSI=False,
"y": Index(6, medium, shuffle, zlib(1)).is_CSI=False,
"x": Index(6, medium, shuffle, zlib(1)).is_CSI=False}
>>> B.get_storer('var3').levels
['x', 'y', 'date']
>>> B.get_storer('var3').attrs
/var3._v_attrs (AttributeSet), 12 attributes:
[CLASS := 'GROUP',
TITLE := '',
VERSION := '1.0',
data_columns := ['date', 'y', 'x'],
index_cols := [(0, 'index')],
levels := ['x', 'y', 'date'],
nan_rep := 'nan',
non_index_axes := [(1, ['x', 'y', 'date', 'var3'])],
pandas_type := 'frame_table',
pandas_version := '0.10.1',
table_type := 'appendable_multiframe',
values_cols := ['values_block_0', 'date', 'y', 'x']]
>>> B.get_storer('var3').table
/var3/table (Table(6313086,)) ''
description := {
"index": Int64Col(shape=(), dflt=0, pos=0),
"values_block_0": Float64Col(shape=(1,), dflt=0.0, pos=1),
"date": Int64Col(shape=(), dflt=0, pos=2),
"y": Int64Col(shape=(), dflt=0, pos=3),
"x": Int64Col(shape=(), dflt=0, pos=4)}
byteorder := 'little'
chunkshape := (3276,)
autoIndex := True
colindexes := {
"date": Index(6, medium, shuffle, zlib(1)).is_CSI=False,
"index": Index(6, medium, shuffle, zlib(1)).is_CSI=False,
"y": Index(6, medium, shuffle, zlib(1)).is_CSI=False,
"x": Index(6, medium, shuffle, zlib(1)).is_CSI=False}
>>> print Atemp
<class 'pandas.io.pytables.HDFStore'>
File path: I:/Data/output/test8\var1temp.h5
/mergev13 frame_table (shape->823446)
는 500000이며, 노드의 형태는 823,446 적어도 하나 개의 덩어리가 병합 말해 준다. 그러나 나는 어디서 오류가 발생하는지 알아낼 수 없으며, 정확히 어디에서 잘못되었는지 발견하려고하는 단서가 없어졌습니다. 어떤 도움을 아주 많이이 같은 오류를 제공 내 테스트 저장소의 chunksize 영역을 줄임으로써
편집
.. 감사합니다. 물론 좋지는 않지만 지금은 나에게 공유 할 수있는 기회를 제공합니다. 코드 + HDFStores는 here을 클릭하십시오.
은''pandas_version 함께 할 때 당신은 참고 파일을 닫아야합니다 ''는 메타 데이터가 저장되는 방법을 가리 킵니다; 이것은 잠시 동안 변경되지 않았습니다. 내가 몇 가지 살펴 보겠습니다 – Jeff