熊猫在加载词典时舍入 int64 数字



我正在将字典列表加载到熊猫数据帧中,即如果d是我的字典列表,则只需:

pd.DataFrame(d)

遗憾的是,字典中的一个值是 64 位整数。它被转换为浮点数,因为某些字典没有此列的值,因此被赋予NaN值,从而将整个列转换为浮点数。

例如:

                col1
0       NaN
1       NaN
2       NaN
3       0.000000e+00
4       1.506758e+18
5       1.508758e+18

如果我尝试将所有NaN fillna为零,则重新转换列astype(np.int64)返回所有略微偏离的值(由于四舍五入)。如何避免这种情况并保持原始 64 位值不变?

演示:

In [10]: d
Out[10]: {'a': [1506758000000000000, nan, 1508758000000000000]}

幼稚的方法:

In [11]: pd.DataFrame(d)
Out[11]:
              a
0  1.506758e+18
1           NaN
2  1.508758e+18

解决方法(注意dtype=str):

In [12]: pd.DataFrame(d, dtype=str).fillna(0).astype(np.int64)
Out[12]:
                     a
0  1506758000000000000
1                    0
2  1508758000000000000

据我所知,这里没有办法覆盖推理,您需要在传递给pandas之前填充缺失的值。 像这样:

d = [{'col1': 1}, {'col2': 2}]
cols_to_check = ['col1']
for row in d:
    for col in cols_to_check:
        if col not in row:
            row[col] = 0
d
Out[39]: [{'col1': 1}, {'col1': 0, 'col2': 2}]
pd.DataFrame(d)
Out[40]: 
   col1  col2
0     1   NaN
1     0   2.0
您可以使用理解

创建系列并使用fill_value参数取消堆栈

pd.Series(
    {(i, j): v for i, x in enumerate(d)
              for j, v in x.items()},
    dtype=np.int64
).unstack(fill_value=0)

最新更新