我在将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
2条答案
按热度按时间kknvjkwl1#
Pandas对整数之类的东西很有趣。从我阅读Pandas文档时的理解来看,Pandas似乎并没有int和float的概念,而且大多数情况下都是在浮点值中工作。
在这种情况下,我会继续使用astype开始处理您的数据,如下所示:
如果它们真的都是整数,那么你应该能够使用这个简单的for循环来将所有的Pandas系列(列)转换为浮点值,如下所示:
如果这对你有用,请告诉我,我刚刚在我的Jupyter Notebook中运行了一个测试,它似乎成功了。
iaqfqrcu2#
将整数列转换为浮点类型的一个常见原因是数据中存在null或缺失值(NaN)。Pandas使用NaN表示缺失值,NaN是一种特殊的浮点值(np.nan)。由于Pandas整数类型不支持NaN,因此包含NaN值的列将自动转换为浮点类型以容纳缺失值。
自1.2.0起,
DataFrame.read_parquet
函数中有一个可选参数use_nullable_dtypes
这是官方文件。
https://pandas.pydata.org/docs/reference/api/pandas.read_parquet.html