从对象列表构建熊猫DataFrame花费的时间太长

问题描述 投票:0回答:1

我正在提取大量数据。它以对象列表的形式出现。

示例:[[objectA,objectB],[objectC],[],[ObjectD] ...]

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

for events in events_list:
    for event in events:
        if len(event) > 1:
           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: for event in events: if len(event) > 1: 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列表进行更改之前,我尝试了字典,但是它比我预期的要慢得多。目前,我正在阅读有关Panads矢量化的信息,该速度似乎非常快,但是我不确定是否可以将其用于我的目的。我知道Python循环有点慢,我对此无能为力,所以我也试图找出一种在数据帧中进行这些循环的方法。

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

python pandas dataframe
1个回答
0
投票
初始方法中计算量大的操作将追加-每次使用final_df.append(df)时,您都会创建一个全新的(每次迭代都更大!)数据帧。而是将所有数据帧聚合到一个列表中,然后使用pd.concat(df_list)

要比在某种程度上可以通过标准python多处理库或通过框架使用多处理快,我建议Dask。

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

© www.soinside.com 2019 - 2024. All rights reserved.