4
votes

Erreur lors de la tentative d'écriture de DataFrame sur le contour progressif. Le plume prend-il en charge les colonnes de liste?

Je travaille à la fois avec R et Python et je souhaite écrire l'un de mes pandas DataFrames sous forme de plume afin de pouvoir l'utiliser plus facilement dans R. Cependant, lorsque j'essaie de l'écrire sous forme de plume, l'erreur suivante:

df[['vector_x', 'vector_y', 'cluster']] = df[['vector_x', 'vector_y', 'cluster']].astype(float)

df[['doc_id', 'text']] = df[['doc_id', 'text']].astype(str)

df[['doc_vector', 'doc_vectors_2d']] = df[['doc_vector', 'doc_vectors_2d']].astype(list)

df.dtypes

Out[1]:
doc_id           object
text             object
doc_vector       object
cluster          float64
doc_vectors_2d   object
vector_x         float64
vector_y         float64
dtype: object

J'ai doublé la vérification de mes types de colonnes et ils sont déjà flottants 64:

In[1]
df.dtypes

Out[1]
id         Object
cluster    int64
vector_x   float64
vector_y   float64

J'obtiens la même erreur indépendamment de en utilisant feather.write_dataframe (df, "path / df.feather") ou df.to_feather("path/df.feather").

J'ai vu cela sur GitHub mais je n'ai pas compris s'il était lié ou non: https: / /issues.apache.org/jira/browse/ARROW-1345 et https: / /github.com/apache/arrow/issues/1430

En fin de compte, je peux simplement l'enregistrer en tant que csv et changer les colonnes en R (ou tout simplement faire toute l'analyse en Python ), mais j'espérais l'utiliser.

Édition 1:

J'ai toujours t Le même problème malgré les bons conseils ci-dessous, alors mettez à jour ce que j'ai essayé.

ArrowInvalid: trying to convert NumPy type float64 but got float32

Edit 2:

Après beaucoup recherche, il semble que le problème est que ma colonne de cluster est un type de liste composé d'entiers int64. Donc je suppose que la vraie quête est, est-ce que le format de plume prend en charge les listes?

Edit 3:

Juste pour attacher ceci dans un arc, la plume ne prend pas en charge des types de données imbriqués comme des listes, du moins pas encore.


1 commentaires

Le stockage des listes sous forme de chaînes a-t-il fonctionné?


3 Réponses :


4
votes

Le problème dans votre cas est la colonne id Object . Ce sont des objets Python et ils ne peuvent pas être représentés dans un format indépendant du langage. Cette plume (en fait la flèche Apache / pyarrow sous-jacente) tente de deviner le type de données de la colonne id . La conjecture est faite sur les premiers objets qu'il voit dans la colonne. Ce sont des scalaires numpy float64 . Plus tard, vous avez des scalaires float32 . Au lieu de les contraindre à un certain type, Arrow est plus strict avec les types et échoue.

Vous devriez être en mesure de contourner ce problème en vous assurant que toutes les colonnes ont un dtype non-objet avec df ['id'] = df ['id']. astype (float) .


3 commentaires

la colonne id est une colonne de chaîne - y a-t-il un type dans lequel je peux le convertir qui est compatible avec la flèche?


Oui, vous pouvez vous assurer que tous les objets de la colonne sont du même type Python en utilisant df ['id']. Astype (str) .


ayant toujours le même problème - il semble que je ne le convertis pas réellement à partir d'un objet. . . J'ai mis à jour la question avec le code que j'ai essayé.



2
votes

Après de nombreuses recherches, la réponse simple est que le contour progressif ne prend pas en charge les colonnes de liste (ou d'autres types de données imbriqués).


0 commentaires

1
votes
  • Heureusement, j'ai trouvé la raison de mon erreur d'E / S plume ici.
  • Et j'ai aussi la solution à ce problème, pandas.to_feather et read_feather sont tous deux basés sur pyarrow, et une colonne qui contient des listes en tant que valeurs est déjà prise en charge par pyarrow à partir de 2019.

pip install pyarrow==latest # my version is 1.0.0 and it work

Ensuite, utilisez toujours pd.to_feather ("Filename") et read_feather.


0 commentaires