瞄准
我正在尝试通过替换将一行附加到 pandas 数据框,其中维护数据类型 (dtype) 至关重要。
问题
为什么在将
row
插入 data_frame
时,dtype 会切换为 object
,而两个对象都不是此 dtype,并且无法从数据中推断出此 dtype?
数据
row
和 data_frame
都是具有相同列、相同数据类型的 pd.DataFrame
对象。data_frame
包含许多具有唯一索引的行。row
仅包含具有唯一索引的单个条目。
问题
为了防止索引重复,我想按如下方式使用
.loc
:
data_frame.loc[idx] = row.loc[idx]
但是,这会将整个数据框的 dtype 更改为
object
:
>>> data_frame['column'].dtype
Int64Dtype()
>>> row['column'].dtype
Int64Dtype()
>>> data_frame.loc[idx] = row.loc[idx]
>>> data_frame['column'].dtype
dtype('O')
另类
我已经选择使用以下替代方法,它通过检查和删除重复项而不是立即覆盖它们来有效地做同样的事情:
data_frame = pd.concat([data_frame, row])
data_frame = data_frame[~data_frame.index.duplicated(keep='last')]
附言
我已阅读有关
.loc
的文档,但找不到有关如何处理数据类型的详细信息。我曾假设主数据框的 dtype 会被维护。pd.Series
对象使用,但我无法在此处正确设置数据类型。
这是自 2014 年以来的一个已知错误: https://github.com/pandas-dev/pandas/issues/6485
错误是因为放大分两个阶段完成,并且
nan
首先放在该列中,然后分配它。
建议通过不分配扩大来避免这种情况。 选项正在构建时填充数据框,或使用
concat
.