2014-09-25 6 views
8

Ich habe einige Pandas DataFrame mit NaNs drin. So:machen Pandas DataFrame zu einem dict und dropna

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 

Jetzt möchte ich eine dict aus ihm machen und zugleich die NaNs entfernen. Das Ergebnis sollte wie folgt aussehen:

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

Aber mit Pandas to_dict Funktion gibt mir ein Ergebnis wie folgt aus:

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

So wie ein dict aus dem Datenrahmen zu machen und werde den NaNs befreien ?

Antwort

4

schreiben eine Funktion von to_dict von Pandas insired

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) 

und als Ergebnis erhalten Sie, was Sie wollen:

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

Es gibt viele Möglichkeiten, dies zu erreichen, konnte ich einige Zeit damit verbracht Auswertung Leistung auf einem nicht so großen (70k) Datenrahmen. Obwohl die Antwort von @ der_die_das_jojo funktioniert, ist sie auch ziemlich langsam.

Die Antwort, die von this question vorgeschlagen wird, stellt sich tatsächlich heraus, auf einem großen Datenframe ungefähr 5x schneller zu sein.

Auf meinem Testdatenrahmen (df):

Above Methode:

%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 

Eine weitere langsame Methode:

%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 

schnellste Methode die ich finden konnte:

%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 

Das Format dieser Ausgabe ist ein zeilenorientiertes Wörterbuch. Möglicherweise müssen Sie Anpassungen vornehmen, wenn Sie die spaltenorientierte Form in der Frage verwenden möchten.

Sehr interessiert, wenn jemand eine noch schnellere Antwort auf diese Frage findet.