python - 从对象列表构建数据帧花费的时间太长

标签 python pandas dataframe

我正在提取大量数据。它作为对象列表的列表出现。

Example: [[objectA, objectB],[objectC],[],[ObjectD]...]

每个对象都有很多属性,但是对于我的数据框,我只需要名称、值、时间戳、描述。 我尝试了两件事:

for events in events_list:
    if len(events) > 0:
       for event in events:
           df = DataFrame([])
           df['timestamp'] = event.timestamp
           df['value'] = event.value
           df['name'] = event.name
           df['desc'] = event.desc
           final_df = final_df.append(df)

这大约需要15 分钟才能完成。

我更改代码以使用 python 列表:

df_list = list()
for events in events_list:
    if len(events) > 0:
       for event in events:
           df_list.append([event.timestamp, event.value, event.name, event.desc])
final_df = pd.DataFrame(df_list, columns=['timestamp', 'value', 'name', 'desc'])

通过这一更改,我设法将时间减少到大约 ~10-11 分钟

我仍在研究是否有办法更快。在使用 python list 进行更改之前,我尝试了字典,但它比我预期的要慢得多。目前我正在阅读有关 Panads 矢量化的文章,它看起来非常快,但我不确定是否可以将它用于我的目的。 我知道 Python 循环有点慢,而且我对此无能为力,因此我也在尝试找出一种在数据帧中执行这些循环的方法。

我的问题是,你们中有人以前解决过这个问题吗?有更好的方法吗?

编辑: 对数据有疑问。它通过 API 实现,并以这种方式构建,因为每组对象都是按名称分组的。例如:

[[objectA, objectB (both have the same name)],[objectC],[EMPTY - There is no data for this name],[ObjectD]...]

因为我无法改变获取数据的方式,所以我必须使用这个数据结构。

最佳答案

初始方法中计算量大的操作是追加 - 每次使用final_df.append(df)时,您都会创建一个全新的(每次迭代都会更大!)数据帧。相反,将所有数据帧聚合到一个列表中并使用 pd.concat(df_list)

为了更快,您可能需要考虑在某种程度上使用多处理,无论是通过标准 python 多处理库还是通过框架 - 我推荐 Dask。

编辑:P.S 如果您的数据最初是 csv/excel/parquet 或 pandas 支持的其他格式,您可以使用 pandas 以非常有效的方式一次性加载所有数据。即使您的事件包含不必要的列,加载整个数据集然后过滤掉冗余列也会更快。

关于python - 从对象列表构建数据帧花费的时间太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59792315/

相关文章:

python - 在 python 中,获取 2d numpy 数组中值总和的最有效方法是什么?

python - 我无法在虚拟机上安装python,安装错误

按比例随机将 NAn 插入数据帧

excel - ValueError 将多索引 Pandas 数据框转换为 Excel

python - 删除 Pandas Dataframe 中按其他列分组的列中频率最低的行

从宽格式到长格式 reshape data.frame

Python OpenCV PCA计算特征值

c# - 在 Python 脚本中使用 .Net (C#) dll

python - Cloud SQL - Postgres - 插入速度非常慢

python - 计算Python中特定列中数字的出现次数