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

时间:2018-10-01 14:06:26

标签: python pandas dataframe

我正在启动一个大矩阵,该矩阵会转换为pandas的数据框,从而使pandas能够推断列的数据类型。

这些列被推断为float64,但随后我可以使用pandas to_numeric函数将这些列向下转换为float32,而不会损失精度。

如果熊猫能够在不损失精度的情况下向下转换为float32,为什么它们不能有效地将其推断为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 个答案:

答案 0 :(得分:0)

  

为什么熊猫无法有效地将列推断为int64

我尚不清楚对int64的强制转换效率很低。这只是数字值的 default dtype,避免了重复检查列中的冗余度,从而避免了重复检查列中的每个值所需的更高精度。列以分配适当的dtype

他们为什么不像integerfloat32那样以这种方式实现它?因为如果列中的任何值超过该默认精度,则需要将整个列重铸为更高的精度,而为此,将需要检查列中的每个单个值。因此,从一开始就假设较高的精度,而不是检查每个值并重新铸造等,这样的冗余/昂贵的事情就会减少。

当然,这似乎不是“最佳”的选择,但是如果您无法为构造函数指定dtype,则必须进行权衡。

  

它们能够被转换为int32而不会损失精度吗?

您对此有误。显然并没有损失精度,但是如果您检查genotype_data_df.dtypes,您会发现它们没有被转换为较低的精度(整数),实际上它们仍然是float64。 / p>

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