前言
Dataframe在数据处理过程中起到至关重要的作用。在处理大量数据时,如何提高datafreme的效率,在实际使用过程遇到的一些问题,在此记录下来,以便以后查找。
运行环境说明:pandas 1.2.4 +python3.7.10
1 创建dataframe
慎用append
dataframe.append会创建一个新对象(和python list的append不一样,这里总是踩坑,输出空的dataframe),因此这样会降低效率且占用很多内存。这里有两个替代方法:
1)将数据用list封装好,一次性创建
2)每次创建一个dataframe添加到list中,最后用concat连接
import pandas as pd
import numpy as np
from datetime import datetime
max_shape = 30000
data={'a': [np.random.rand() for _ in range(1000)], 'b': [np.random.rand() for _ in range(1000)]}
if 1:
start = datetime.now()
res = pd.DataFrame()
for i in range(max_shape):
res = res.append(data,ignore_index=True)
print('append use time:%s s.' % (datetime.now() - start))
if 1:
start = datetime.now()
list1 = [ pd.DataFrame(data) for _ in range(max_shape)]
res = pd.concat(list1, ignore_index=True)
print('list dataframe concat use time:%s s.' % (datetime.now() - start))
if 1:
start = datetime.now()
a=[]
b=[]
for i in range(max_shape):
a.extend(data['a'])
b.extend(data['b'])
res = pd.DataFrame({'a':a,'b':b})
print('list collection use time:%s s.' % (datetime.now() - start))
运行结果:
append use time:0:00:49.892728 s.
list dataframe concat use time:0:00:13.914202 s.
list collection use time:0:00:05.631400 s.
结论:
1)dataframe中append方法每次产生一个新对象,比较耗时。
2)pandas的concat函数处理较快,但是在之前需要产生每一个dataframe,需要分配空间,耗时。
3)将dataframe的数据提前封装在list里,而list中append和extend在原对象中直接修改,效率较高。最后通过dataframe创建一次分配一次内存,耗时短。