Pandas Dataframe Parquet数据类型?

时间:2018-09-10 19:18:21

标签: python pandas numpy parquet pyarrow

我正在尝试使用Pandas和Pyarrow拼花数据。我有数百个实木复合地板文件,它们不需要具有相同的架构,但是如果各个实木复合地板之间的列匹配,则它们必须具有相同的数据类型。

我正在遇到这样的情况,即结果实木复合地板数据类型不是我想要的。例如,我可以将int64写入一列,并且生成的拼花地板将采用double格式。这会在处理方面造成很多麻烦,因为正确地输入了99%的数据,但是在1%的情况下,这只是错误的类型。

我尝试导入numpy并以这种方式包装值-

import numpy as np

pandas.DataFrame({
  'a': [ np.int64(5100), np.int64(5200), np.int64(5300) ]
})

但是我偶尔还是会拿到双倍,所以这肯定是错误的方法。如何确保镶木地板文件中各列的数据类型一致?

更新-

我发现只有在列中包含一个或多个None时才会发生这种情况。

data_frame = pandas.DataFrame({
  'a': [ None, np.int64(5200), np.int64(5200) ]
})

实木复合地板不能处理混合的None-int64 cols吗?

1 个答案:

答案 0 :(得分:4)

Pandas目前无法处理整数列(版本0.23.x)中的null / na值。在下一个版本中,将有一个可为空的整数类型。同时,一旦您在整数列中包含空值,Pandas就会自动将其转换为浮点列。因此,在生成的Parquet文件中也有一个float列:

import numpy as np
import pandas as pd

df = pd.DataFrame({
  'a': [np.int64(5100), np.int64(5200), np.int64(5300)]
})
# df['a'].dtype == dtype('int64')
df = pd.DataFrame({
  'a': [None, np.int64(5200), np.int64(5200)]
})
# df['a'].dtype == dtype('float64')