2017-04-06 73 views
2

我已經偶然發現了一個小熊貓的問題,它的方法to_dict。 我有我敢肯定有每一行中相同的列相等數量的表格,讓我們說,它看起來就像是:pandas.to_dict返回None與nan混合

+----|----|----+ 
|COL1|COL2|COL3| 
+----|----|----+ 
|VAL1| |VAL3| 
| |VAL2|VAL3| 
|VAL1|VAL2| | 
+----|----|----+ 

當我做df.to_dict(orient='records')我得到:

[{ 
    "COL1":"VAL1" 
    ,"COL2":nan 
    ,"COL3":"VAL3" 
} 
,{ 
    "COL1":None 
    ,"COL2":"VAL2" 
    ,"COL3":"VAL3" 
} 
,{ 
    "COL1":"VAL1" 
    ,"COL2":"VAL2" 
    ,"COL3":nan 
}] 

通知nan在一些列和None的其他(總是相同的,在同一列中似乎沒有nanNone

而當我做json.loads(df.to_json(orient='records')) ig只有Nonenan(這是所需的輸出)。

像這樣:

[{ 
    "COL1":"VAL1" 
    ,"COL2":None 
    ,"COL3":"VAL3" 
} 
,{ 
    "COL1":None 
    ,"COL2":"VAL2" 
    ,"COL3":"VAL3" 
} 
,{ 
    "COL1":"VAL1" 
    ,"COL2":"VAL2" 
    ,"COL3":None 
}] 

我希望得到一些解釋,爲什麼會發生,如果它能夠以某種方式加以控制。

== ==編輯

根據意見倒不如先「與None小號的替代那些nan,但那些nan的不np.nan

>>> a = df.head().ix[0,60] 
>>> a 
nan 
>>> type(a) 
<class 'numpy.float64'> 
>>> a is np.nan 
False 
>>> a == np.nan 
False 

回答

2

我想你只replace可以,它不是在to_dict可能的控制:

L = [{ 
    "COL1":"VAL1" 
    ,"COL2":np.nan 
    ,"COL3":"VAL3" 
} 
,{ 
    "COL1":None 
    ,"COL2":"VAL2" 
    ,"COL3":"VAL3" 
} 
,{ 
    "COL1":"VAL1" 
    ,"COL2":"VAL2" 
    ,"COL3":np.nan 
}] 

df = pd.DataFrame(L).replace({np.nan:None}) 
print (df) 
    COL1 COL2 COL3 
0 VAL1 None VAL3 
1 None VAL2 VAL3 
2 VAL1 VAL2 None 

print (df.to_dict(orient='records')) 
[{'COL3': 'VAL3', 'COL2': None, 'COL1': 'VAL1'}, 
{'COL3': 'VAL3', 'COL2': 'VAL2', 'COL1': None}, 
{'COL3': None, 'COL2': 'VAL2', 'COL1': 'VAL1'}] 
+0

不幸的是,這並不活像k:P 這個np.NaN不等於我在表格中的內容(這很奇怪) –

+0

'VALs'是數字還是'strings'? – jezrael

+0

字符串 - 數據從json加載 –