Python 加速数据导入功能(熊猫和附加到数据帧)
我们的数据输出文件夹包含数量可变的.csv文件,这些文件与包含所有不同记录参数的.xml文件关联。每个.csv文件代表记录数据的“扫描”,因此我目前正试图找出如何将所有这些文件合并到一个大型多索引(扫描和时间)数据帧中进行处理(因为我们通常一次查看整个扫描集并找到平均值) 到目前为止,我有以下两个功能。第一种方法只是对数据帧进行一些小的修改,使其在将来更易于管理Python 加速数据导入功能(熊猫和附加到数据帧),python,performance,pandas,append,dataframe,Python,Performance,Pandas,Append,Dataframe,我们的数据输出文件夹包含数量可变的.csv文件,这些文件与包含所有不同记录参数的.xml文件关联。每个.csv文件代表记录数据的“扫描”,因此我目前正试图找出如何将所有这些文件合并到一个大型多索引(扫描和时间)数据帧中进行处理(因为我们通常一次查看整个扫描集并找到平均值) 到目前为止,我有以下两个功能。第一种方法只是对数据帧进行一些小的修改,使其在将来更易于管理 def import_pcsv(filename): df = pd.read_csv(filename, skipiniti
def import_pcsv(filename):
df = pd.read_csv(filename, skipinitialspace=True)
df.rename(columns = {df.columns[0]:'Time'}, inplace=True)
df.Time = df.Time/1000
df.set_index('Time', inplace=True)
return df
第二个是解析文件夹的真正工作。它获取文件夹中的所有xml文件,解析它们(使用另一个模块中的另一个函数),然后将关联的csv文件导入到一个大数据帧中
def import_pfolder(folder):
vr_xmls = glob(folder+r'\*VoltageRecording*.xml')
data = pd.DataFrame()
counter = 1
for file in vr_xmls:
file_vals = pxml.parse_vr(file)
df = import_pcsv(folder + '\\' + file_vals['voltage recording'] + '.csv')
df['Sweep'] = 'Sweep' + str(counter)
df.set_index('Sweep', append=True, inplace=True)
data = data.append(df.reorder_levels(['Sweep','Time']))
counter+=1
return data
问题是,如果文件夹中有大量文件,这会变得非常缓慢。第一个函数基本上与正常的pandas read_csv函数一样快(慢了几毫秒,但没关系)
我对文件夹中不同数量的csv/xml文件对运行了一些计时测试。每个时间的百分比为:
1个文件=339毫秒
5个文件=2.61秒
10个文件=7.53秒
20个文件=24.7秒
40个文件=87秒
最后一个是真正的杀手
为了解决这个问题,我在import_pfolder()中的for循环的每一行上都得到了一些时间统计数据-括号中的时间是从%timeit开始的最佳时间
第1行=2毫秒(614us)
第二行=98毫秒(82.2毫秒)
第三行=21毫秒(10.8毫秒)
第四行=49毫秒
第5行=225毫秒
我猜速度变慢是因为每次循环都必须在最后一行复制整个数据帧。不过,我很难想出如何避免这种情况。在.csv文件中,我唯一确定的一列是第一列(第一次)-其中的文件可以具有可变数量的列和行。有没有一种方法可以预先分配一个数据帧,并将这种可变性考虑在内?那会有帮助吗
如有任何建议,将不胜感激
谢谢不要像那样附加数据帧(也不要以空数据帧开始),每个附加都是一个副本。这将导致一个单一的副本和持续的附加性能。Concat文档是 相反:
frames = []
for f in files:
frames.append(process_your_file(f))
result = pd.concat(frames)
不要像那样附加数据帧(也不要以空数据帧开始),每个附加都是一个副本。这将导致一个单一的副本和持续的附加性能。Concat文档是 相反:
frames = []
for f in files:
frames.append(process_your_file(f))
result = pd.concat(frames)
完美的我想知道如何使用concat,但我没想到会这样做(很明显)。谢谢上周,一位同事遇到了同样的问题。在
DataFrame.append的文档中有一个很好的大警告将有助于避免这种情况。我同意(我刚刚在烹饪书中添加了这个配方),但是有人想对doc string和concat部分进行PR吗?列表理解ftwperfect!我想知道如何使用concat,但我没想到会这样做(很明显)。谢谢上周,一位同事遇到了同样的问题。在DataFrame.append的文档中有一个很好的大警告将有助于避免这种情况。我同意(我刚刚在烹饪书中添加了这个配方),但是有人想对doc string和concat部分进行PR吗?列表理解ftw