以下在熊猫中的行为给我带来了一些调试时间,所以我想我应该分享一下。我认为这可能是一个错误,但不确定。在第一种情况下,数据帧包含用于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)
答案 0 :(得分:0)
我的最佳猜测是,当使用.at
或.loc
进行分配时,它可能首先扩展,从而创建了NaN
占位符,从而强制执行int
的{{1}}列中。绝对是在上述情况下,您首先分配了float列,这要求在将{填充之前,将float
占位符放在同一行(第二行和后续行)的NaN
列中{1}}值,因此这会将列强制为unit
。 tmp_int
不会自动将该列向下转换。
另一方面,如果您首先定义dtype,则使用能够容纳float
的新pandas
类型不会发生强制转换:
'Int64'