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.
3 Réponses :
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
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.
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.
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.
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)
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.