首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HDF5 min_itemsize error: ValueError:尝试在[y]列中存储带有len [##]的字符串,但该列的限制是[##]!

HDF5 min_itemsize error: ValueError:尝试在[y]列中存储带有len [##]的字符串,但该列的限制是[##]!
EN

Stack Overflow用户
提问于 2016-10-10 06:54:53
回答 2查看 4.7K关注 0票数 5

使用pandas.HDFStore().append()后,我将得到以下错误

代码语言:javascript
复制
ValueError: Trying to store a string with len [150] in [values_block_0] column but  this column has a limit of [127]!

Consider using min_itemsize to preset the sizes on these columns

我正在创建一个熊猫DataFrame并将其添加到HDF5文件中,如下所示:

代码语言:javascript
复制
import pandas as pd

store = pd.HDFStore("test1.h5", mode='w')

hdf_key = "one_key"

columns = ["col1", "col2", ... ]

df = pd.Dataframe(...)
df.col1 = df.col1.astype(str)
df.col2 = df.col2astype(int)
df.col3 = df.col3astype(str)
.... 
store.append(hdf_key, df, data_column=columns, index=False)

我在上面得到了一个错误:"ValueError:试图在values_block_列中存储一个具有len 150的字符串,但是这个列的限制是127!“

之后,我执行代码:

代码语言:javascript
复制
store.get_storer(hdf_key).table.description

哪种输出

代码语言:javascript
复制
{
  "index": Int64Col(shape=(), dflt=0, pos=0),
  "values_block_0": StringCol(itemsize=127, shape=(5,), dflt=b'', pos=1),
  "values_block_1": Int64Col(shape=(5,), dflt=0, pos=2),
  "col1": StringCol(itemsize=20, shape=(), dflt=b'', pos=3),
  "col2": StringCol(itemsize=39, shape=(), dflt=b'', pos=4)}

values_block_0values_block_1是什么?

所以,遵循这个StackOverflow itemsize of the elements of a MultiIndex,我尝试了

代码语言:javascript
复制
store.append(hdf_key, df, data_column=columns, index=False,  min_itemsize={"values_block_0":250})

但这不起作用

代码语言:javascript
复制
ValueError: Trying to store a string with len [250] in [values_block_0] column but  this column has a limit of [127]!

Consider using min_itemsize to preset the sizes on these columns

我做错了什么?

编辑:此代码从filename.py生成错误filename.py

代码语言:javascript
复制
import pandas as pd
store = pd.HDFStore("test1.h5", mode='w')
hdf_key = "one_key"

my_columns = ["col1", "col2", ... ]

df = pd.Dataframe(...)
df.col1 = df.col1.astype(str)
df.col2 = df.col2astype(int)
df.col3 = df.col3astype(str)
.... 
store.append(hdf_key, df, data_column=my_columns, index=False, min_itemsize={"values_block_0":350})

以下是完整的错误:

代码语言:javascript
复制
(python-3) -bash:1008 $ python filename.py
Traceback (most recent call last):
  File "filename.py", line 50, in <module>
    store.append(hdf_key, dicts_into_df,  data_column=my_columns, index=False, min_itemsize={'values_block_0':350})
  File "/path/lib/python-3/lib/python3.5/site-packages/pandas/io/pytables.py", line 970, in append
    **kwargs)
  File "/path/lib/python-3/lib/python3.5/site-packages/pandas/io/pytables.py", line 1315, in _write_to_group
    s.write(obj=value, append=append, complib=complib, **kwargs)
  File "/path/lib/python-3/lib/python3.5/site-packages/pandas/io/pytables.py", line 4263, in write
    obj=obj, data_columns=data_columns, **kwargs)
  File "/path/lib/python-3/lib/python3.5/site-packages/pandas/io/pytables.py", line 3853, in write
    **kwargs)
  File "/path/lib/python-3/lib/python3.5/site-packages/pandas/io/pytables.py", line 3535, in create_axes
    self.validate_min_itemsize(min_itemsize)
  File "/path/lib/python-3/lib/python3.5/site-packages/pandas/io/pytables.py", line 3174, in validate_min_itemsize
    "data_column" % k)
ValueError: min_itemsize has the key [values_block_0] which is not an axis or data_column
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-10 09:17:15

更新:

您拼写错了data_columns参数:data_column -它应该是data_columns。因此,在HDF中没有任何索引列,并且HDF存储添加了values_block_X

代码语言:javascript
复制
In [70]: store = pd.HDFStore(r'D:\temp\.data\my_test.h5')

拼写错误的参数将被忽略:

代码语言:javascript
复制
In [71]: store.append('no_idx_wrong_dc', df, data_column=df.columns, index=False)

In [72]: store.get_storer('no_idx_wrong_dc').table
Out[72]:
/no_idx_wrong_dc/table (Table(10,)) ''
  description := {
  "index": Int64Col(shape=(), dflt=0, pos=0),
  "values_block_0": Float64Col(shape=(1,), dflt=0.0, pos=1),
  "values_block_1": Int64Col(shape=(1,), dflt=0, pos=2),
  "values_block_2": StringCol(itemsize=30, shape=(1,), dflt=b'', pos=3)}
  byteorder := 'little'
  chunkshape := (1213,)

与以下内容相同:

代码语言:javascript
复制
In [73]: store.append('no_idx_no_dc', df, index=False)

In [74]: store.get_storer('no_idx_no_dc').table
Out[74]:
/no_idx_no_dc/table (Table(10,)) ''
  description := {
  "index": Int64Col(shape=(), dflt=0, pos=0),
  "values_block_0": Float64Col(shape=(1,), dflt=0.0, pos=1),
  "values_block_1": Int64Col(shape=(1,), dflt=0, pos=2),
  "values_block_2": StringCol(itemsize=30, shape=(1,), dflt=b'', pos=3)}
  byteorder := 'little'
  chunkshape := (1213,)

让我们把它拼写正确:

代码语言:javascript
复制
In [75]: store.append('no_idx_dc', df, data_columns=df.columns, index=False)

In [76]: store.get_storer('no_idx_dc').table
Out[76]:
/no_idx_dc/table (Table(10,)) ''
  description := {
  "index": Int64Col(shape=(), dflt=0, pos=0),
  "value": Float64Col(shape=(), dflt=0.0, pos=1),
  "count": Int64Col(shape=(), dflt=0, pos=2),
  "s": StringCol(itemsize=30, shape=(), dflt=b'', pos=3)}
  byteorder := 'little'
  chunkshape := (1213,)

旧答案:

AFAIK您可以有效地将设置为,只在第一个附加的上设置min_itemsize参数

演示:

代码语言:javascript
复制
In [33]: df
Out[33]:
   num                 s
0   11  aaaaaaaaaaaaaaaa
1   12    bbbbbbbbbbbbbb
2   13     ccccccccccccc
3   14       ddddddddddd

In [34]: store = pd.HDFStore(r'D:\temp\.data\my_test.h5')

In [35]: store.append('test_1', df, data_columns=True)

In [36]: store.get_storer('test_1').table.description
Out[36]:
{
  "index": Int64Col(shape=(), dflt=0, pos=0),
  "num": Int64Col(shape=(), dflt=0, pos=1),
  "s": StringCol(itemsize=16, shape=(), dflt=b'', pos=2)}

In [37]: df.loc[4] = [15, 'X'*200]

In [38]: df
Out[38]:
   num                                                  s
0   11                                   aaaaaaaaaaaaaaaa
1   12                                     bbbbbbbbbbbbbb
2   13                                      ccccccccccccc
3   14                                        ddddddddddd
4   15  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...

In [39]: store.append('test_1', df, data_columns=True)
...
skipped
...
ValueError: Trying to store a string with len [200] in [s] column but
this column has a limit of [16]!
Consider using min_itemsize to preset the sizes on these columns    

现在使用min_itemsize,但仍然附加到现有的store对象:

代码语言:javascript
复制
In [40]: store.append('test_1', df, data_columns=True, min_itemsize={'s':250})
...
skipped
...
ValueError: Trying to store a string with len [250] in [s] column but
this column has a limit of [16]!
Consider using min_itemsize to preset the sizes on these columns

如果我们要在我们的store中创建一个新的对象,下面的工作是可行的

代码语言:javascript
复制
In [41]: store.append('test_2', df, data_columns=True, min_itemsize={'s':250})

检查列的大小:

代码语言:javascript
复制
In [42]: store.get_storer('test_2').table.description
Out[42]:
{
  "index": Int64Col(shape=(), dflt=0, pos=0),
  "num": Int64Col(shape=(), dflt=0, pos=1),
  "s": StringCol(itemsize=250, shape=(), dflt=b'', pos=2)}
票数 4
EN

Stack Overflow用户

发布于 2018-05-21 09:23:35

我开始在将Pandas从18.1更新到22.0 (尽管这可能与此无关)的同时就开始出现这个错误。

我通过手动读取HDF5文件中的数据来修正现有HDF5文件中的错误,然后为错误中提到的列编写一个具有更大min_itemsize的新min_itemsize文件:

代码语言:javascript
复制
filename_hdf5 = "C:\test.h5"
df = pd.read_hdf(filename_hdf5, 'table_name')
hdf = HDFStore(filename_hdf5)
hdf.put('table_name', df, format='table', data_columns=True, min_itemsize={'ColumnNameMentionedInError': 10})
hdf.close()

然后,我更新了现有的代码,以便在创建密钥时设置min_itemsize

专家额外费用

发生此错误的原因是试图将更多的行附加到现有的数据格式中,其列宽度对于新数据来说太窄了。第一次写入数据时,固定列宽度最初是根据列中最长的字符串设置的。

我认为熊猫应该透明地处理这个错误,而不是为将来的所有附加物留下一个有效的定时炸弹。这个问题可能需要数周甚至几年才能浮出水面。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39952715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档