2017-10-16 112 views
1

我加載詞典列表爲大熊貓數據幀時,即當d是我的類型的字典的列表,只需大紅大紫的Int64數一個64位整數。它正在轉換爲浮點數,因爲某些字典沒有該列的值,因此會給出值NaN,從而將整列轉換爲浮點數。熊貓加載字典

例如:

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

如果我嘗試fillna所有NaN s到零,那麼重鑄列astype(np.int64)返回值是所有稍微偏離(由於舍入)。我怎樣才能避免這種情況並保持原來的64位值不變?

回答

3

演示:

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 
+0

我喜歡它。在構造函數中大量使用'dtype'。 – piRSquared

+0

@piRSquared,謝謝! :) – MaxU

+0

爲什麼不只是'pd.DataFrame(d,dtype = np.int64)'? –

2

據我所知,沒有辦法在這裏覆蓋推斷,您需要在傳遞到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 
+0

謝謝,我擔心這是唯一的方法。 – guy

1

您可以創建一個系列有理解力並用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)