将parquet数据转换为pandas Dataframe 时的数据类型问题

0s7z1bwu  于 2023-03-28  发布在  其他
关注(0)|答案(2)|浏览(232)

我在将parquet文件转换为dataframe时遇到了文件类型问题。
我知道

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

原始数据都是整数,在pandas数据框中操作对象时,操作速度非常慢。

  • 如何将 parquet 列转换为pandas中的int或float格式?
  • 或者最好像上面那样在pandas Dataframe 上操作,并使用pd.to_numeric或类似的东西?
  • 或者原始数据格式decimal(9, 0)有问题?

或者最好直接在pandas Dataframe 上转换?
read_pq.column('_COL_0').cast('int32')抛出一个错误,如

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

kknvjkwl1#

Pandas对整数之类的东西很有趣。从我阅读Pandas文档时的理解来看,Pandas似乎并没有int和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中运行了一个测试,它似乎成功了。

iaqfqrcu

iaqfqrcu2#

将整数列转换为浮点类型的一个常见原因是数据中存在null或缺失值(NaN)。Pandas使用NaN表示缺失值,NaN是一种特殊的浮点值(np.nan)。由于Pandas整数类型不支持NaN,因此包含NaN值的列将自动转换为浮点类型以容纳缺失值。
自1.2.0起,DataFrame.read_parquet函数中有一个可选参数use_nullable_dtypes

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

相关问题