2014-09-25 17 views
8

Ho alcuni DataFrame panda con NaNs in esso. Ti piace questa:rende pda DataFrame a un dict e 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 

Ora voglio fare un dict fuori di esso e, allo stesso tempo rimuovere il NaN. Il risultato dovrebbe essere simile a questo:

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

Ma usando i panda to_dict funzione mi dà un risultato come questo:

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

Quindi, come fare un dict fuori dal dataframe e sbarazzarsi della NaN ?

risposta

4

scrivere una funzione insired da to_dict da panda

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) 

e come risultato si ottiene ciò che si vuole:

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

Ci sono molti modi si potrebbe ottenere questo risultato, ho trascorso qualche tempo valutare prestazioni su un dataframe non molto grande (70k). Anche se la risposta di @ der_die_das_jojo è funzionale, è anche piuttosto lenta.

La risposta suggerita da this question in realtà si rivela essere circa 5 volte più veloce su una grande dataframe.

Sulla mia prova dataframe (df):

Sopra metodo:

%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 

Un altro metodo lento:

%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 

metodo più veloce che ho trovato:

%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 

Il formato di questo output è un dizionario orientato alla riga, potrebbe essere necessario apportare modifiche se si desidera il modulo orientato alla colonna nella domanda.

Molto interessato se qualcuno trova una risposta ancora più veloce a questa domanda.

Problemi correlati