将数据框转换为行系列字典

时间:2019-12-05 03:09:22

标签: python pandas dataframe dictionary iteration

我需要在非常大的数据帧(1000万x 70)上进行迭代(无法进行矢量操作)。 df.iterrows并使用df.loc [i,col]直接访问数据框太慢了。在过去,我首先将数据框转换为字典字典,这使我可以非常快速地进行迭代。但是,此方法占用大量内存,因此对于我当前的数据不再可行。

我需要牺牲一些查找速度来节省内存。做这个的最好方式是什么?将我的数据框变成行系列{index:Series}的字典有效吗?

2 个答案:

答案 0 :(得分:0)

您的意思是这样的吗?

In [1112]: pd.DataFrame(df.reset_index().to_dict(orient='records'))                                                                                                                                        
Out[1112]: 
   index  id  block check
0      0   6     25   yes
1      1   6     32    no
2      2   9     18   yes
3      3  12     17    no
4      4  15     23   yes
5      5  15     11   yes
6      6  15     15   yes

In [1113]: df.reset_index().to_dict(orient='records')                                                                                                                                                      
Out[1113]: 
[{'index': 0, 'id': 6, 'block': 25, 'check': 'yes'},
 {'index': 1, 'id': 6, 'block': 32, 'check': 'no'},
 {'index': 2, 'id': 9, 'block': 18, 'check': 'yes'},
 {'index': 3, 'id': 12, 'block': 17, 'check': 'no'},
 {'index': 4, 'id': 15, 'block': 23, 'check': 'yes'},
 {'index': 5, 'id': 15, 'block': 11, 'check': 'yes'},
 {'index': 6, 'id': 15, 'block': 15, 'check': 'yes'}]

答案 1 :(得分:0)

您可以执行此操作(感谢@oppressionslayer作为示例df):

df

   id  block check
0   6     25   yes
1   6     32    no
2   9     18   yes
3  12     17    no
4  15     23   yes
5  15     11   yes
6  15     15   yes

df.to_dict('index')

输出:

{0: {'id': 6, 'block': 25, 'check': 'yes'}, 1: {'id': 6, 'block': 32, 'check': 'no'}, 2: {'id': 9, 'block': 18, 'check': 'yes'}, 3: {'id': 12, 'block': 17, 'check': 'no'}, 4: {'id': 15, 'block': 23, 'check': 'yes'}, 5: {'id': 15, 'block': 11, 'check': 'yes'}, 6: {'id': 15, 'block': 15, 'check': 'yes'}}

如果您(出于某种原因)特别希望它为{index:series},则可以执行此操作,可以通过相同的方式(即df_name[i][col])进行访问

df.T.to_dict('series')