【问题标题】:Create a Dask Dataframes from a strings representing multilevel dictionaries从表示多级字典的字符串创建 Dask Dataframes
【发布时间】:2019-03-08 04:04:30
【问题描述】:

我有一个庞大的数据集,我正在尝试从字符串列表中制作 dask 数据帧

df_.head():

A   |            B              |     C
----------------------------------------
1   | "{a:1, {b:2, c:3}, d:5}"  |     4
2   | "{a:5, {b:2, c:3}, d:0}"  |     7
...

注意c列是一个字符串,所以我必须做一个literal_eval

在熊猫中我做了以下事情:

import ast

for i in range(0,len(df_),1):
    df_.at[i,'B'] = ast.literal_eval(df_.iloc[i,2])

dat = pd.DataFrame()
for i in range(len(df_)):
#Makes the list of dicts into a dataframe
b = pd.DataFrame(df_.iloc[i,2])
#Keeps track of row number
b['A']=i
#Concat with master DF
dat=pd.concat([dat,b], axis=0, ignore_index=True)

然后,在此之后,我将 dat 与基于 A 列的原始数据框 (df_) 合并。

这个过程需要很长时间,所以我想在黎明时分完成。

谢谢。

【问题讨论】:

  • 嗨丹尼尔,你介意提供mcve吗?

标签: python pandas dictionary dask


【解决方案1】:

dat=pd.concat([dat,b],axis=0,ignore_index=True)

在这一行中,您重复分配了一个新的 Pandas 数据框,其大小不断增加。每次迭代重新创建数据框可能非常非常慢。

您可以尝试使用像 mapapply 这样的 Pandas 操作来一次性对您的输入数据帧执行此操作。

您可能在这里不需要 Dask。在引入并行计算的额外复杂性之前,最好从上面列出的更简单的优化开始。

【讨论】:

  • 谢谢 MRoklin。实际上,最昂贵的部分是这个:` #将字典列表放入数据帧` b = pd.DataFrame(df_.iloc[i,1]) #跟踪行号 b['A']=i我这样做是因为我想将标识符添加到b,因为df_.B中的所有字典都有不同的长度。
猜你喜欢
  • 1970-01-01
  • 2016-12-02
  • 2011-07-06
  • 2016-08-25
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 2016-03-23
相关资源
最近更新 更多