为什么在逐行建立数据帧时熊猫会转换dtype?

时间:2019-02-11 23:51:37

标签: python pandas

以下在熊猫中的行为给我带来了一些调试时间,所以我想我应该分享一下。我认为这可能是一个错误,但不确定。在第一种情况下,数据帧包含用于uint64的正确dtype,在第二种情况下,当逐行构建时,它似乎会自动转换为float64。此外,我知道在大多数情况下,创建数据帧的方法比逐行创建的方法更好,但似乎仍然不应该这样。我的问题是这是错误还是预期的行为。这可能与returning coerced dtype有关,这是我可以找到的全部搜索内容。

import numpy as np
import pandas as pd
tmp_float = np.array([1.0,2.0,3.0]).astype('float64')
tmp_int = np.array([1,2,3]).astype('uint64')
nonrow_dataframe = pd.DataFrame({'float': tmp_float, 'uint': tmp_int})
print(nonrow_dataframe['uint'].dtype)
row_dataframe = pd.DataFrame()
row = 0
for i in range(3):
    row_dataframe.at[row, 'float'] = tmp_float[i]
    row_dataframe.at[row, 'uint'] = tmp_int[i]
    row +=1
print(row_dataframe['uint'].dtype)

1 个答案:

答案 0 :(得分:0)

我的最佳猜测是,当使用.at.loc进行分配时,它可能首先扩展,从而创建了NaN占位符,从而强制执行int的{​​{1}}列中。绝对是在上述情况下,您首先分配了float列,这要求在将{填充之前,将float占位符放在同一行(第二行和后续行)的NaN列中{1}}值,因此这会将列强制为unittmp_int不会自动将该列向下转换。

另一方面,如果您首先定义dtype,则使用能够容纳float的新pandas类型不会发生强制转换:

'Int64'