替换pandas数据框行会覆盖所有列的数据类型

2 投票
1 回答
2708 浏览
提问于 2025-04-17 23:24

当我替换一个数据框(df)中的一行时,原本是整数类型的某一列变成了浮点数类型。我希望它能保持为整数类型。

我创建了这个数据框:

testdate = pd.datetime(2014, 1, 1)
adddata = {'intcol':0,'floatcol':0.0}
df = pd.DataFrame(data=adddata, index=pd.date_range(testdate, periods=1))

如我所愿,一列是整数类型,另一列是浮点数类型,这一点通过 df.dtypes 可以确认:

floatcol    float64
intcol        int64
dtype: object

然后我用 df.ix[testdate] = pd.Series(adddata) 来覆盖已有的一行(在这个例子中只有一行)。我故意使用相同的数据来展示这个问题:整数列变成了浮点数。 df.dtypes

floatcol    float64
intcol      float64
dtype: object

需要注意的是,我可以单独更改单元格(例如 df.ix[testdate,'floatcol'] = 0.0),这样列的数据类型就能保持不变,但实际上我有很多列需要同时覆盖,所以一个一个来做太麻烦了。

1 个回答

3

有趣的是,即使把数据类型指定为 object 也没有什么帮助:

>>> df.loc[testdate,:] = pd.Series(adddata, dtype='object')
>>> df.dtypes
floatcol    float64
intcol      float64
dtype: object

可能有人有更好的解决办法,但我发现这个方法有效:

>>> df.loc[testdate,:] = pd.Series(list(adddata.values()), adddata.keys(), dtype='object')
>>> df.dtypes
floatcol    float64
intcol        int64
dtype: object

不过,如果行的值是 dict 格式的话,可能这样做会更简单:

>>> df.loc[testdate,:] = list(map(adddata.get, df.columns))
>>> df.dtypes
floatcol    float64
intcol        int64
dtype: object

撰写回答