代码之家  ›  专栏  ›  技术社区  ›  Parsa

为什么Pandas DataFrame函数推断float64可以向下转换为float32

  •  0
  • Parsa  · 技术社区  · 7 年前

    我开始一个大的矩阵,我把它转换成熊猫中的dataframe,让熊猫推断出列的数据类型。

    这些列被推断为float64,但我随后能够使用pandas将这些列向下转换为float32 to_numeric 无精度损失的功能。

    如果列可以向下转换为float32而不损失精度,那么为什么pandas会低效地将列推断为float64呢?

    a = np.matrix('0.1 0.2; 0.3 0.4')
    a_df = pd.DataFrame(list(map(np.ravel, a)), dtype=None)
    print(genotype_data_df.dtypes)
    # the columns are float64
    genotype_data_df = a_df.apply(pd.to_numeric, downcast='float')
    # the columns are now float32
    

    我假设有一个潜在的技术或实际的原因,为什么库是这样实现的?如果是这样的话,我期待一个能解释为什么会这样的答案。

    1 回复  |  直到 7 年前
        1
  •  0
  •   David Zemens    7 年前

    为什么pandas会低效地将列推断为int64

    int64 效率低下。这只是 违约 dtype 对于数值,它避免了将列重新转换为更高精度时的冗余,这是通过检查 每一个 列中的值,以便分配适当的 数据类型

    为什么他们用这种方式来实施,而不是说 integer float32 ? 因为如果列中的任何值超过该默认精度,则需要将整个列重新转换为更高的精度,为此需要检查列中的每个值。因此,从一开始就假设精度更高,而不是检查每个值并重新计算等,这样冗余度和成本更低。

    数据类型 对于构造器。

    他们能够降到int32而不损失精度?

    你搞错了。显然精度没有损失,但如果你检查一下 genotype_data_df.dtypes ,您将看到它们没有被转换为较低的精度(整数),实际上它们仍然是 float64 .

    >> a = np.matrix('0.1 0.2; 0.3 0.4')
    >> a_df = DF(list(map(np.ravel, a)), dtype=None)
    >> genotype_data_df = a_df.apply(pd.to_numeric, downcast='integer')
    >> genotype_data_df.dtypes
    
    0    float64
    1    float64
    dtype: object