使用DataFrame.to_dict时dtype会发生变化

tim*_*irg 4 python pandas

uint64在我的DataFrame中有一个列,但是当我将该DataFrame转换为python dict的列表时DataFrame.to_dict('record'),以前的内容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}
Run Code Online (Sandbox Code Playgroud)

我该如何避免这种奇怪的行为?

更新

奇怪的是,如果我使用to_dict()而不是to_dict('records'),bd_id列将是int类型:

In [43]: mid.to_dict()['bd_id']
Out[43]:
{0: 0,
 1: 6957860914294,
 2: 7219009614965,
...
Run Code Online (Sandbox Code Playgroud)

max*_*moo 10

这是因为另一列中有一个浮点数.更具体地说to_dict('records'),使用values数据框的属性而不是列本身来实现,这实现了"隐式向上转换",在您将uint64转换为float的情况下.

如果您想解决此错误,可以将数据帧明确地转换为object数据类型:

df.astype(object).to_dict('record')[2]['bd_id']
Out[96]: 7602051814214
Run Code Online (Sandbox Code Playgroud)

顺便说一下,如果您正在使用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]
Run Code Online (Sandbox Code Playgroud)