【问题标题】:pandas.DataFrame.to_hdf() fails on dtypes objectpandas.DataFrame.to_hdf() 在 dtypes 对象上失败
【发布时间】:2020-08-04 14:04:01
【问题描述】:

我正在尝试将 pandas DataFrame 导出到 hdf5 文件。具有以下结构的 DataFrame。

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 4 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   a       4 non-null      float64
 1   b       4 non-null      float64
 2   c       4 non-null      float64
 3   d       4 non-null      object 
dtypes: float64(3), object(1)
memory usage: 256.0+ bytes

在 d 列中,我确实将一些文件路径存储为类型。 &lt;class 'pathlib.WindowsPath'&gt;

如果我这样调用 to_hdf() 函数 df.to_hdf(r'C:\data\test.h5', mode='w', key=key,format='table', data_columns=True) 我会收到以下错误。

File "C:\py36_4\lib\site-packages\pandas\io\pytables.py", line 4800, in _maybe_convert_for_string_atom
    for i in range(len(block.shape[0])):
TypeError: object of type 'int' has no len()

如果我跳过 d 列,导出到 hdf5 将按预期工作。因此,这似乎是 d 列和使用的类型 '&lt;class 'pathlib.WindowsPath'&gt;' 的问题?

更新我的问题:

以下代码将重现此问题。

df1=pd.DataFrame({'a':['test1','test2'],'b':[1.1,2.1]})
df1.to_hdf('test1.h5', key='test1', format='table', data_columns=True)
    
df2=pd.DataFrame(df1.loc[1,:]).transpose()
df2.to_hdf('test2.h5', key='test2', format='table', data_columns=True)

我看起来问题来自 transpose() 函数。这会将所有列的dtype 更改为object,并且df2 的hdf5 导出将失败。这似乎也只有在 DataFrame df1 的一列属于这种类型时才会发生。

【问题讨论】:

  • 我做了一些进一步的测试。如果我将 d 列转换为字符串,则导出正在工作。 df.d=df.d.astype(str)。所以在 hdf5 导出中不支持 类型。

标签: python pandas hdf5 pathlib


【解决方案1】:

我无法证实您的观察。最新版本的 pandas 和表现在支持 pathlib 路径的序列化。也许你应该

pip install --upgrade pandas tables

【讨论】:

  • 很抱歉我错过了这些信息。 Python 3.6.4,熊猫 1.0.3,表 3.6.1。所以我认为我的环境是最新的?这已通过运行您的 pip 命令得到确认。
  • 好的,但是您应该共享您的 DataFrame() 构造函数,以便可以重现此错误。在 hdf 中存储路径列没有问题。
  • 对于我迟到的回复,我深表歉意。我对我的问题进行了更新,您可能会重现该问题。
【解决方案2】:

在类似的情况下,我的问题是我有一个名为 0 的列(这是由于我在调用 pd.DataFrame 时有一个带有字典的 numpy 数组而不是带有字典的列表而创建的)。

重命名列解决了所有问题。

【讨论】:

  • 感谢您的想法,但我认为它在我的情况下有所不同。我为我的问题添加了更新以重现此问题。
【解决方案3】:

对我来说,它通过使用这里指出的 infer_objects() 函数解决了这个问题: https://pandas.pydata.org/pandas-docs/stable/getting_started/basics.html#basics-dtypes

df1=pd.DataFrame({'a':['test1','test2'],'b':[1.1,2.1]})   
df2=pd.DataFrame(df1.loc[1,:]).transpose()
df2 = df2.infer_objects()
df2.to_hdf('test2.h5', key='test2', format='table', data_columns=True)

【讨论】:

    【解决方案4】:

    这似乎是熊猫的一个错误。

    参考38919

    现在,你不应该使用 int 作为列名,例如使用字符串

    【讨论】:

      猜你喜欢
      • 2011-07-16
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多