我的 DataFrame 中有一个 uint64
列,但是当我使用 DataFrame.to_dict('record')
将该 DataFrame 转换为 python 字典列表时,之前的内容uint64
神奇地转换为 float:
In [24]: mid['bd_id'].head()
Out[24]:
0 0
1 6957860914294
2 7219009614965
3 7602051814214
4 7916807114255
Name: bd_id, dtype: uint64
In [25]: mid.to_dict('record')[2]['bd_id']
Out[25]: 7219009614965.0
In [26]: bd = mid['bd_id']
In [27]: bd.head().to_dict()
Out[27]: {0: 0, 1: 6957860914294, 2: 7219009614965, 3: 7602051814214, 4: 7916807114255}
如何避免这种奇怪的行为?
更新
奇怪的是,如果我使用 to_dict()
而不是 to_dict('records')
,bd_id
列将是 int 类型:
In [43]: mid.to_dict()['bd_id']
Out[43]:
{0: 0,
1: 6957860914294,
2: 7219009614965,
...
最佳答案
这是因为另一列中有一个 float 。更具体地说, to_dict('records')
是使用数据框的 values
属性而不是列本身来实现的,这实现了“隐式向上转换”,在您的情况下转换uint64 float 。
如果你想绕过这个错误,你可以明确地将你的数据帧转换为 object
数据类型:
df.astype(object).to_dict('record')[2]['bd_id']
Out[96]: 7602051814214
顺便说一句,如果您使用的是 IPython,并且想了解一个函数是如何在库中实现的,您可以通过在方法调用的末尾放置 ??
来将其关闭。对于 pd.DataFrame.to_dict??
我们看到
...
elif orient.lower().startswith('r'):
return [dict((k, v) for k, v in zip(self.columns, row))
for row in self.values]
关于python - 使用 DataFrame.to_dict 时 dtype 发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31374928/