如何快速将pandas数据帧行转换为ordereddict

use*_*428 17 python ordereddictionary dataframe pandas

寻找一种快速的方法,将pandas数据帧中的一行放入一个有序的dict中,而不使用list.列表很好,但是大数据集需要很长时间.我正在使用fiona GIS阅读器,并且行是有序的,并且模式给出了数据类型.我用pandas来加入数据.在很多情况下,行将具有不同的类型,所以我在考虑变成一个带有字符串类型的numpy数组可能会成功.

And*_*den 20

不幸的是,你不能只是做一个申请(因为它适合它回到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
Run Code Online (Sandbox Code Playgroud)

但你可以使用iterrows的列表理解:

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

如果可以使用生成器而不是列表,那么通常会更高效:

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


jez*_*ael 17

这是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)]))])
Run Code Online (Sandbox Code Playgroud)