Проблемы с типами данных при преобразовании данных паркета в кадр данных Pandas

У меня проблема с типами файлов при преобразовании файла паркета в фрейм данных.

я делаю

bucket = 's3://some_bucket/test/usages'

import pyarrow.parquet as pq
import s3fs
s3 = s3fs.S3FileSystem()

read_pq = pq.ParquetDataset(bucket, filesystem=s3).read_pandas()

Когда я делаю read_pq, Я получил

pyarrow.Table
_COL_0: decimal(9, 0)
_COL_1: decimal(9, 0)
_COL_2: decimal(9, 0)
_COL_3: decimal(9, 0)

Когда я делаю df = read_pd.to_pandas(); df.dtypes, Я получил

_COL_0    object
_COL_1    object
_COL_2    object
_COL_3    object
dtype: object

Исходные данные являются целыми числами. Когда я оперирую объектами в фрейме данных панд, операции выполняются очень медленно.

  • Как я могу преобразовать столбцы паркета в формат, который будет читаться как int или как число с плавающей точкой в ​​пандах?
  • Или лучше всего работать с кадром данных панд, как указано выше, и использовать pd.to_numeric или похожие?
  • Или есть проблема с исходным форматом данных decimal(9, 0)?

Или лучше всего конвертировать данные прямо в панду?

Я старался: read_pq.column('_COL_0').cast('int32') выдает ошибку вроде

No cast implemented from decimal(9, 0) to int32

2 ответа

Панды смешно насчет целых чисел и тому подобного. Из того, что я понимаю при чтении документации pandas, Pandas на самом деле, похоже, не имеет концепции int по сравнению с float и в основном работает со значениями float.

В этой ситуации я бы пошел дальше и использовал astype, чтобы начать работать с вашими данными следующим образом:

      df['_COL_0'] = df['_COL_0'].astype(float)

Если они действительно являются целыми числами, вы сможете использовать этот простой цикл for для приведения всех серий (столбцов) pandas к значениям с плавающей запятой, например:

      for col in df.columns:
  df[col] = df[col].astype(float)

Сообщите мне, работает ли это для вас. Я только что провел тест в своем Jupyter NoteBook, и, похоже, он сработал.

Одной из распространенных причин преобразования целочисленных столбцов в типы с плавающей запятой является наличие в данных нулевых или отсутствующих значений (NaN). Pandas представляет пропущенные значения с помощью NaN, который представляет собой специальное значение с плавающей запятой (np.nan). Поскольку целочисленный тип Pandas не поддерживает NaN, столбцы, содержащие значения NaN, автоматически преобразуются в типы с плавающей запятой для размещения отсутствующих значений.

Начиная с версии 1.2.0 существует необязательный аргументuse_nullable_dtypesвDataFrame.read_parquetфункция

      import pandas as pd

bucket = 's3://some_bucket/test/usages'

df = pd.read_parquets(bucket, use_nullable_dtypes=True)

Вот официальный документ.

https://pandas.pydata.org/docs/reference/api/pandas.read_parquet.html

Другие вопросы по тегам