我正在尝试使用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吗?
答案 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')