Как превратить строку <data> в строку pandas в orderdict fast

Ищете быстрый способ получить строку в фрейме pandas в упорядоченном dict с использованием списка. Список хорош, но с большими наборами данных потребуется много времени. Я использую fiona GIS reader, а строки упорядочены с помощью схемы, дающей тип данных. Я использую pandas для объединения данных. Во многих случаях строки будут иметь разные типы, поэтому я думал, что превращение в массив numpy с типом строки может сделать трюк.

Ответ 1

К сожалению, вы не можете просто применить заявку (поскольку она подходит к 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

Но вы можете использовать понимание списка с помощью iterrows:

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

Если бы можно было использовать генератор, а не список, то, что бы вы с ним работали, обычно будет более эффективным:

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

Ответ 2

Это реализовано в pandas 0.21.0+ в функции to_dict с параметром 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)]))])