pandas to_feather "Unsupported numpy type 5" и принудительно заставляет df.eval () явно указывать dtype - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть файл данных объемом 500 ГБ, который я изменяю с помощью df.eval (), а затем сохраняю в формате пера.Вот пример программы, показывающей ошибку пера:

import pandas as pd

df = pd.DataFrame([[1.0, 0.678, 'hello'], [2.0, 0.779, 'foo'], [3.0, 0.218, 'bar']], dtype='float32', columns=['x','y','txt'])
print(df)
print(df.dtypes)

df.eval('z=(0 + 1*(y>0.7 and y<=0.85) + 2*(y>0.85))', inplace=True)
df.eval('x=(0 + 1*(txt=="hello" or txt=="foo"))', inplace=True)
print(df.dtypes)

df.to_feather('c:/temp/test.feather')

со следующим результатом:

     x      y    txt
0  1.0  0.678  hello
1  2.0  0.779    foo
2  3.0  0.218    bar

x      float32
y      float32
txt     object
dtype: object

x        int32
y      float32
txt     object
z      float64
dtype: object

---------------------------------------------------------------------------
ArrowNotImplementedError                  Traceback (most recent call last)
<ipython-input-35-0843a56bb3a8> in <module>()
----> 1 df.to_feather('c:/temp/test.feather')

~\Anaconda3\lib\site-packages\pandas\core\frame.py in to_feather(self, fname)
   1887         """
   1888         from pandas.io.feather_format import to_feather
-> 1889         to_feather(self, fname)
   1890 
   1891     def to_parquet(self, fname, engine='auto', compression='snappy',

~\Anaconda3\lib\site-packages\pandas\io\feather_format.py in to_feather(df, path)
     81         raise ValueError("feather must have string column names")
     82 
---> 83     feather.write_dataframe(df, path)
     84 
     85 

~\Anaconda3\lib\site-packages\pyarrow\feather.py in write_feather(df, dest)
     98     writer = FeatherWriter(dest)
     99     try:
--> 100         writer.write(df)
    101     except Exception:
    102         # Try to make sure the resource is closed

~\Anaconda3\lib\site-packages\pyarrow\feather.py in write(self, df)
     78         # TODO(wesm): Remove this length check, see ARROW-1732
     79         if len(df.columns) > 0:
---> 80             batch = RecordBatch.from_pandas(df, preserve_index=False)
     81             for i, name in enumerate(batch.schema.names):
     82                 col = batch[i]

table.pxi in pyarrow.lib.RecordBatch.from_pandas()

~\Anaconda3\lib\site-packages\pyarrow\pandas_compat.py in dataframe_to_arrays(df, schema, preserve_index, nthreads)
    369         arrays = [convert_column(c, t)
    370                   for c, t in zip(columns_to_convert,
--> 371                                   convert_types)]
    372     else:
    373         from concurrent import futures

~\Anaconda3\lib\site-packages\pyarrow\pandas_compat.py in <listcomp>(.0)
    368     if nthreads == 1:
    369         arrays = [convert_column(c, t)
--> 370                   for c, t in zip(columns_to_convert,
    371                                   convert_types)]
    372     else:

~\Anaconda3\lib\site-packages\pyarrow\pandas_compat.py in convert_column(col, ty)
    364 
    365     def convert_column(col, ty):
--> 366         return pa.array(col, from_pandas=True, type=ty)
    367 
    368     if nthreads == 1:

array.pxi in pyarrow.lib.array()

array.pxi in pyarrow.lib._ndarray_to_array()

error.pxi in pyarrow.lib.check_status()

ArrowNotImplementedError: Unsupported numpy type 5

В этой таблице 2500 столбцов, поэтому мне понадобилось некоторое время, чтобы найти столбец, вызвавший ошибкуособенно потому, что int32 указан как допустимый тип пера: https://github.com/wesm/feather

Следующий код исправил проблему:

df['x'] = df['x'].astype('float32')
df.to_feather('c:/temp/test.feather')

Итак, у меня два вопроса:

1) Что я делаю, что вызывает проблемы для to_feather ()?

2) Есть ли способ явного приведения результата присваивания?(Я пытаюсь избежать дополнительного выделения памяти / освобождения памяти, требуемого с помощью astype (), поскольку это медленно и не дает никаких преимуществ.)

Я пробовал это:

df.eval('x=float(0 + 1*(txt=="hello" or txt=="foo"))', inplace=True)

, но этоРезультаты:

ValueError: "float" is not a supported function
...