Проблемы с типами данных при преобразовании данных паркета в кадр данных 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