2014-09-25 36 views
8

我有一些帶有NaN的熊貓數據框。 像這樣:將熊貓數據框設爲字典和帖子

import pandas as pd 
import numpy as np 
raw_data={'A':{1:2,2:3,3:4},'B':{1:np.nan,2:44,3:np.nan}} 
data=pd.DataFrame(raw_data) 
>>> data 
    A B 
1 2 NaN 
2 3 44 
3 4 NaN 

現在我想打一個字典了出來,並在同一時間刪除NaN的。 結果應該是這樣的:

{'A': {1: 2, 2: 3, 3: 4}, 'B': {2: 44.0}} 

但使用熊貓to_dict功能給了我這樣的結果:

>>> data.to_dict() 
{'A': {1: 2, 2: 3, 3: 4}, 'B': {1: nan, 2: 44.0, 3: nan}} 

那麼如何讓一個字典出數據幀和擺脫的NaN ?

回答

4

寫信大熊貓

import pandas as pd 
import numpy as np 
from pandas import compat 

def to_dict_dropna(self,data): 
    return dict((k, v.dropna().to_dict()) for k, v in compat.iteritems(data)) 

raw_data={'A':{1:2,2:3,3:4},'B':{1:np.nan,2:44,3:np.nan}} 
data=pd.DataFrame(raw_data) 

dict=to_dict_dropna(data) 

和to_dict insired的功能,結果你得到你想要的東西:

>>> dict 
{'A': {1: 2, 2: 3, 3: 4}, 'B': {2: 44.0}} 
2

有,你可以做到這一點的方法很多,我花了一些時間來評估在不太大(70k)數據幀上的性能。雖然@ der_die_das_jojo的答案是功能性的,但它也很慢。

this question建議的答案實際上在大型數據框上大約快了5倍。

在我的測試數據框(df):

以上方法:

%time [ v.dropna().to_dict() for k,v in df.iterrows() ] 
CPU times: user 51.2 s, sys: 0 ns, total: 51.2 s 
Wall time: 50.9 s 

另一種緩慢的方法:

%time df.apply(lambda x: [x.dropna()], axis=1).to_dict(orient='rows') 
CPU times: user 1min 8s, sys: 880 ms, total: 1min 8s 
Wall time: 1min 8s 

最快的方法,我可以找到:

%time [ {k:v for k,v in m.items() if pd.notnull(v)} for m in df.to_dict(orient='rows')] 
CPU times: user 14.5 s, sys: 176 ms, total: 14.7 s 
Wall time: 14.7 s 

此輸出的格式是一個面向行的字典,如果您希望問題中的列爲導向的表單,則可能需要進行調整。

如果有人發現這個問題更快的答案很有興趣。