Ошибка при попытке записи DataFrame в перо. Поддерживает ли перо столбцы списка? - PullRequest
0 голосов
/ 24 января 2019

Я работаю как с R, так и с Python, и я хочу написать одну из моих панд DataFrames как перо, чтобы мне было легче работать с ней в R. Однако, когда я пытаюсь написать это как перо, я получаюследующая ошибка:

ArrowInvalid: trying to convert NumPy type float64 but got float32

Я дважды проверил типы столбцов, и они уже плавают 64:

In[1]
df.dtypes

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

Я получаю одну и ту же ошибку независимо от использования feather.write_dataframe(df, "path/df.feather") или df.to_feather("path/df.feather").

Я видел это на GitHub, но не понял, было ли это связано: https://issues.apache.org/jira/browse/ARROW-1345 и https://github.com/apache/arrow/issues/1430

В конце концов, я могу просто сохранить его какCSV и изменить столбцы в R (или просто сделать весь анализ в Python), но я надеялся использовать это.

Редактировать 1:

Все еще имеята же проблема, несмотря на замечательный совет, приведенный ниже, поэтому обновите то, что я пробовал.

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

Edit 2:

После долгих поисков кажется, что проблемачто мой столбец кластера является типом списка, состоящим из целых чисел int64.Итак, я думаю, что настоящий квест в том, поддерживает ли перо формат списки?

1 Ответ

0 голосов
/ 25 января 2019

Проблема в вашем случае - столбец id Object.Это объекты Python, и они не могут быть представлены в нейтральном для языка формате.Это перо (на самом деле лежащая в основе Apache Arrow / pyarrow) пытается угадать тип данных столбца id.Предположение делается на первых объектах, которые он видит в столбце.Это float64 NumPy скаляры.Позже у вас есть float32 скаляры.Вместо того, чтобы приводить их к какому-либо типу, Arrow более строг с типами и дает сбой.

Вы должны обойти эту проблему, убедившись, что все столбцы имеют необъектный dtype с df['id'] = df['id'].astype(float). * 1009.*

...