【问题标题】:Pandas Dataframe Parquet Data Types?Pandas Dataframe Parquet 数据类型?
【发布时间】:2019-02-15 06:19:43
【问题描述】:

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

我遇到的情况是,得到的 parquet 数据类型不是我想要的。例如,我可以将int64 写入列,生成的镶木地板将采用double 格式。这在处理方面造成了很多麻烦,其中 99% 的数据输入正确,但在 1% 的情况下,它只是错误的类型。

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

import numpy as np

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

但我仍然偶尔会得到双倍,所以这一定是错误的方法。如何确保 parquet 文件中各列的数据类型一致?

更新-

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

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

parquet 不能处理混合的 None-int64 cols 吗?

【问题讨论】:

    标签: python pandas numpy parquet pyarrow


    【解决方案1】:

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

    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')
    

    【讨论】:

    猜你喜欢
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    相关资源
    最近更新 更多