替换pandas数据帧行会覆盖所有列的dtypes

时间:2014-03-22 09:09:53

标签: python pandas

当我替换df的一行时,它会导致现有的dtype = int列变为float。我想把它保持为int。

我创建了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))

根据需要,一列是int,另一列是float,由df.dtypes确认:

floatcol    float64
intcol        int64
dtype: object

然后我使用df.ix[testdate] = pd.Series(adddata)覆盖现有行(在这种情况下只有1行)。我故意使用相同的数据来显示问题:intcol已成为浮点数。 df.dtypes

floatcol    float64
intcol      float64
dtype: object

请注意,我可以单独更改单元格(例如df.ix[testdate,'floatcol'] = 0.0)并保持列dtypes,但实际上我有多于2列我想要同时覆盖,所以一次只做一个繁琐。

1 个答案:

答案 0 :(得分: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