python - Pandas pytable : how to specify min_itemsize of the elements of a MultiIndex

标签 python pandas pytables

我将 pandas 数据框存储为包含 MultiIndex 的 pytable。

MultiIndex的第一层是一个字符串,对应一个userID。现在,大多数用户 ID 的长度都是 13 个字符,但也有一些是 15 个字符。当我追加一条包含长用户 ID 的记录时,pytables 会引发错误,因为它需要一个 13 个字符的字段。

ValueError('Trying to store a string with len [15] in [user] column but\nthis column has a limit of [13]!\nConsider using min_itemsize to preset the sizes on these columns',)

但是,我不知道如何为 MultiIndex 的元素设置属性 min_itemsize。我试过 {'index': 15} 但它不起作用...

我知道我可以通过附加空格强制所有 ID 从一开始就长度为 15 个字符,但我希望尽可能避免这种情况。

感谢您的帮助!

最佳答案

您需要指定要为其设置 min_itemsize 的多索引级别的名称。这是一个例子:

创建 2 个多索引框架

In [1]: df1 = DataFrame(np.random.randn(4,2),index=MultiIndex.from_product([['abcdefghijklm','foo'],[1,2]],names=['string','number']))

In [2]: df2 = DataFrame(np.random.randn(4,2),index=MultiIndex.from_product([['abcdefghijklmop','foo'],[1,2]],names=['string','number']))

In [3]: df1
Out[3]: 
                             0         1
string        number                    
abcdefghijklm 1       0.737976  0.840718
              2       0.605763  1.797398
foo           1       1.589278  0.104186
              2       0.029387  1.417195

[4 rows x 2 columns]

In [4]: df2
Out[4]: 
                               0         1
string          number                    
abcdefghijklmop 1       0.539507 -1.059085
                2       1.263722 -1.773187
foo             1       1.625073  0.078650
                2      -0.030827 -1.691805

[4 rows x 2 columns]

创建商店

In [9]: store = pd.HDFStore('test.h5',mode='w')

In [10]: store.append('df1',df1)

这里是计算的长度

In [12]: store.get_storer('df1').table
Out[12]: 
/df1/table (Table(4,)) ''
  description := {
  "index": Int64Col(shape=(), dflt=0, pos=0),
  "values_block_0": Float64Col(shape=(2,), dflt=0.0, pos=1),
  "number": Int64Col(shape=(), dflt=0, pos=2),
  "string": StringCol(itemsize=13, shape=(), dflt='', pos=3)}
  byteorder := 'little'
  chunkshape := (1456,)
  autoindex := True
  colindexes := {
    "index": Index(6, medium, shuffle, zlib(1)).is_csi=False,
    "number": Index(6, medium, shuffle, zlib(1)).is_csi=False,
    "string": Index(6, medium, shuffle, zlib(1)).is_csi=False}

这是你现在得到的错误

In [13]: store.append('df1',df2)

ValueError: Trying to store a string with len [15] in [string] column but
this column has a limit of [13]!
Consider using min_itemsize to preset the sizes on these columns

用关卡名称指定min_itemsize

In [14]: store.append('df',df1,min_itemsize={ 'string' : 15 })

In [15]: store.get_storer('df').table
Out[15]: 
/df/table (Table(4,)) ''
  description := {
  "index": Int64Col(shape=(), dflt=0, pos=0),
  "values_block_0": Float64Col(shape=(2,), dflt=0.0, pos=1),
  "number": Int64Col(shape=(), dflt=0, pos=2),
  "string": StringCol(itemsize=15, shape=(), dflt='', pos=3)}
  byteorder := 'little'
  chunkshape := (1394,)
  autoindex := True
  colindexes := {
    "index": Index(6, medium, shuffle, zlib(1)).is_csi=False,
    "number": Index(6, medium, shuffle, zlib(1)).is_csi=False,
    "string": Index(6, medium, shuffle, zlib(1)).is_csi=False}

附加

In [16]: store.append('df',df2)

In [19]: store.df
Out[19]: 
                               0         1
string          number                    
abcdefghijklm   1       0.737976  0.840718
                2       0.605763  1.797398
foo             1       1.589278  0.104186
                2       0.029387  1.417195
abcdefghijklmop 1       0.539507 -1.059085
                2       1.263722 -1.773187
foo             1       1.625073  0.078650
                2      -0.030827 -1.691805

[8 rows x 2 columns]

In [20]: store.close()

关于python - Pandas pytable : how to specify min_itemsize of the elements of a MultiIndex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22710738/

相关文章:

python cursor.execute 返回空

需要登录的Python阅读url

python - 类型错误 : unhashable type: 'LineString'

python - 根据另一行的值更新数据框中的行值?

python - 如何判断 Pandas 数据框中的列是否属于日期时间类型?如何判断列是否为数字?

python - 在 plotly 子图中更改单轴

python - 命名数据类型数组 : Difference between a[0] ['name' ] and a ['name' ][0]?

python - 使用 odo 将巨大的 h5 文件与多个数据集合并为一个

python - PyTables 列到普通 python 列表

homebrew - 在 M1 Mac 上找不到 PyTables 的 HDF5 安装