我正在将字典列表加载到熊猫数据帧中,即如果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)