替换pandas数据框行会覆盖所有列的数据类型
当我替换一个数据框(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