2013-09-25 24 views
10

Alla ricerca di un modo rapido per ottenere una riga in un dataframe panda in una dict ordinata senza lista. La lista va bene, ma con grandi serie di dati ci vorrà molto. Sto usando il lettore GIS di fiona e le righe sono ordinate con lo schema che fornisce il tipo di dati. Uso i panda per unire i dati. In molti casi le righe avranno diversi tipi, quindi stavo pensando che trasformarsi in un array numpy con una stringa di tipo potrebbe fare il trucco.Come trasformare rapidamente la riga dataframe di panda in ordereddict

risposta

16

Purtroppo non si può solo fare un applicano (in quanto si adatta di nuovo ad un dataframe):

In [1]: df = pd.DataFrame([[1, 2], [3, 4]], columns=['a', 'b']) 

In [2]: df 
Out[2]: 
    a b 
0 1 2 
1 3 4 

In [3]: from collections import OrderedDict 

In [4]: df.apply(OrderedDict) 
Out[4]: 
    a b 
0 1 2 
1 3 4 

Ma è possibile utilizzare la comprensione lista con iterrows:

In [5]: [OrderedDict(row) for i, row in df.iterrows()] 
Out[5]: [OrderedDict([('a', 1), ('b', 2)]), OrderedDict([('a', 3), ('b', 4)])] 

Se era possibile utilizzare un generatore, piuttosto che una lista, a qualsiasi cosa stavate lavorando sarebbe più efficiente:

In [6]: (OrderedDict(row) for i, row in df.iterrows()) 
Out[6]: <generator object <genexpr> at 0x10466da50> 
4

Questo è implementato in pandas 0.21.0+ in funzione to_dict con parametro into:

df = pd.DataFrame([[1, 2], [3, 4]], columns=['a', 'b']) 
print (df) 
    a b 
0 1 2 
1 3 4 

d = df.to_dict(into=OrderedDict, orient='index') 
print (d) 
OrderedDict([(0, OrderedDict([('a', 1), ('b', 2)])), (1, OrderedDict([('a', 3), ('b', 4)]))]) 
Problemi correlati