dan*_*n_g 1 python performance append dataframe pandas
我们的数据输出文件夹包含可变数量的.csv文件,这些文件与包含所有不同记录参数的.xml文件相关联.每个.csv文件代表记录数据的"扫描",所以我目前正试图弄清楚如何将所有这些文件组合成一个大的多索引(扫描#和时间)数据帧进行处理(因为我们通常在看一次扫描一整套并找到平均值).
到目前为止,我有以下两个功能.第一个只是对数据框进行了一些小修改,使其在未来的路上更易于管理.
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
Run Code Online (Sandbox Code Playgroud)
第二个是解析文件夹的真正主力.它抓取文件夹中的所有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
Run Code Online (Sandbox Code Playgroud)
问题是如果文件夹中有大量文件,这会变得非常慢.第一个函数基本上和普通的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)
第2行= 98毫秒(82.2毫秒)
第3行= 21 ms(10.8ms)
第4行= 49毫秒
第5行= 225毫秒
我猜测减速是因为必须在每个循环的最后一行中复制整个数据帧.不过,我无法弄清楚如何避免这种情况.我在.csv文件中确定的唯一一列是第一个(时间) - 那里的文件可以有可变数量的列和行.有没有办法事先预先分配一个数据帧,将这种可变性考虑在内?这会有帮助吗?
任何建议,将不胜感激.
谢谢
Jef*_*eff 10
根本不追加这样的DataFrames(也不要以空的方式开头),每个追加都是一个副本.这将导致单个副本和不断追加的性能.Concat文档在这里
代替:
frames = []
for f in files:
frames.append(process_your_file(f))
result = pd.concat(frames)
Run Code Online (Sandbox Code Playgroud)