2013-09-25 13 views
10

Poszukuje szybkiego sposobu na dodanie wiersza w ramce danych pandy do uporządkowanego dict bez użycia listy. Lista jest w porządku, ale z dużymi zbiorami danych może potrwać długo. Używam czytnika Fiona GIS, a wiersze są uporządkowane z schematem podającym typ danych. Używam pand do łączenia danych. W wielu przypadkach wiersze będą miały różne typy, więc pomyślałem zamienienie w tablicę numpy z ciągiem znaków, która może załatwić sprawę.Jak zamienić wiersz danych pandy na uporządkowany dokument Szybki

Odpowiedz

16

Niestety nie można po prostu zrobić zastosowania (ponieważ wpisuje się go z powrotem do 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 

Ale można użyć wyrażeń listowych z iterrows:

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

jeśli to można użyć generatora, a nie listy, do tego, z czym pracowałeś, zwykle będzie bardziej wydajny:

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

ten jest realizowany w pandas 0.21.0+ w funkcji to_dict parametrem 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)]))]) 
Powiązane problemy