大数据量时生成DataFrame避免使用效率低的append方法

发布时间 2023-07-27 20:07:41作者: 午夜稻草人


转载请注明出处:https://www.cnblogs.com/oceanicstar/p/10900332.html 

append方法可以很方便地拼接两个DataFrame

df1.append(df2)

>    A  B
> 1 A1 B1
> 2 A2 B2
> 3 A3 B3
> 4 A4 B4

但数据量大时生成DataFrame,应避免使用append方法

因为:
       与python列表中的append和extend方法不同的是pandas的append方法不会改变原来的对象,而是创建一个新的对象。当然,这样的话会使效率变低而且会占用更多内存,所以如果你有很多数据需要append,建议使用列表,然后传给DataFrame。
       建议直接用空列表依次装好各列的数据,再统一生成总的dataframe表,如下例所示。
import pandas as pd
import numpy as np
from datetime import datetime


# 模拟生成较大批次量的数据
df_list = [pd.DataFrame({
    'a': [np.random.rand() for _ in range(20000)],
    'b': [np.random.rand() for _ in range(20000)]
}) for i in range(800)]


# %% 第一种方式(运行时间最长——1分钟,内存占用一般)
start1 = datetime.now()
res1 = pd.DataFrame()
for df in df_list:
    res1 = res1.append(df)
print('append耗时:%s秒' % (datetime.now() - start1))


# %% 第二种方式(运行时间相对第一种少一些——46秒,但内存接近溢出)
start2 = datetime.now()
dict_list = [df.to_dict() for df in df_list]
combine_dict = {}
i = 0
for dic in dict_list:
    length = len(list(dic.values())[0])
    for idx in range(length):
        combine_dict[i] = {k: dic[k][idx] for k in dic.keys()}
        i += 1
res2 = pd.DataFrame.from_dict(combine_dict, 'index')
print('dict合并方式耗时:%s秒' % (datetime.now() - start2))


# %% 第三种方式:list装好所有值(运行时间最短——4秒多,内存占用低)
start3 = datetime.now()
columns = ['a', 'b']
a_list = []
b_list = []

for df in df_list:
    a_list.extend(df['a'])
    b_list.extend(df['b'])
res3 = pd.DataFrame({'a': a_list, 'b': b_list})
print('list装好所有值方式耗时:%s秒' % (datetime.now() - start3))