我正在提取大量数据。它以对象列表的形式出现。
示例:[[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'])
通过此更改,我设法将时间减少到大约〜。 我仍在研究是否有更快的方法。在使用python列表进行更改之前,我尝试了字典,但是它比我预期的要慢得多。目前,我正在阅读有关Panads矢量化的信息,该速度似乎非常快,但是我不确定是否可以将其用于我的目的。我知道Python循环有点慢,我对此无能为力,所以我也试图找出一种在数据帧中进行这些循环的方法。10-11分钟
我的问题是,你们当中有人解决过这个问题吗,有没有更好的方法?
final_df.append(df)
时,您都会创建一个全新的(每次迭代都更大!)数据帧。而是将所有数据帧聚合到一个列表中,然后使用pd.concat(df_list)
。要比在某种程度上可以通过标准python多处理库或通过框架使用多处理快,我建议Dask。
编辑:PS如果您的数据最初是csv / excel / parquet或pandas支持的另一种格式,则可以使用pandas以一种非常有效的方式一次加载所有数据。即使您的事件包括不必要的列,加载整个数据集然后过滤掉多余的列也会更快。