1
votes

pandas.DataFrame.to_hdf () échoue sur l'objet dtypes

J'essaye d'exporter un pandas DataFrame vers un fichier hdf5. Le DataFrame ayant la structure suivante:

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)

Dans la colonne d, je stocke certains chemins de fichiers en tant que type.

Si j'appelle la fonction to_hdf () comme ceci df.to_hdf (r'C: \ data \ test.h5 ', mode =' w ', key = key, format =' table ', data_columns = True) J'obtiendrai l'erreur suivante.

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()

Si je saute la colonne d, l'exportation vers hdf5 fonctionne comme prévu. Donc, cela semble être un problème de colonne d et du type utilisé ' '?

Mettre à jour ma question: strong>

Le code suivant reproduira ce problème.

<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

Il semble que le problème vient de la fonction transpose (). Cela changera le dtype de toutes les colonnes en object et l'exportation hdf5 échouera pour df2 . Cela semble également ne se produire que si une colonne du DataFrame df1 est de ce type.


1 commentaires

J'ai fait quelques tests supplémentaires. Si je convertis la colonne d en chaîne, l'exportation fonctionne. df.d = df.d.astype (str). Ainsi, le type n'est pas pris en charge dans l'exportation hdf5.


3 Réponses :


0
votes

Je ne peux pas confirmer votre observation. Les dernières versions de pandas et de tables prennent désormais en charge la sérialisation de pathlib Path's. Peut-être que vous devriez

pip install --upgrade pandas tables


3 commentaires

Je suis désolé d'avoir manqué cette information. Python 3.6.4, pandas 1.0.3, tableaux 3.6.1. Alors je pense que mon environnement est à jour? Ce qui a été confirmé en exécutant votre commande pip.


D'accord, mais alors vous devriez partager votre constructeur DataFrame (), afin que cette erreur soit reproductible. Je n'ai eu aucun problème avec le stockage d'une colonne Path en hdf.


Je suis vraiment désolé pour ma réponse tardive. J'ai mis à jour ma question dans laquelle vous pourrez peut-être reproduire le problème.



0
votes

Dans un cas similaire, mon problème était que j'avais une colonne nommée 0 (créée par le fait que j'avais un tableau numpy avec des dictonaires au lieu d'une liste avec des dictionnaires lors de l'appel de pd .DataFrame ).

Le changement de nom de la colonne a résolu tous les problèmes.


1 commentaires

Merci pour votre idée mais je pense que c'est quelque peu différent dans mon cas. J'ai ajouté une mise à jour à ma question pour reproduire ce problème.



0
votes

Pour moi, cela a résolu le problème en utilisant la fonction infer_objects () indiquée ici: 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)


0 commentaires