Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 加速数据导入功能(熊猫和附加到数据帧)_Python_Performance_Pandas_Append_Dataframe - Fatal编程技术网

Python 加速数据导入功能(熊猫和附加到数据帧)

Python 加速数据导入功能(熊猫和附加到数据帧),python,performance,pandas,append,dataframe,Python,Performance,Pandas,Append,Dataframe,我们的数据输出文件夹包含数量可变的.csv文件,这些文件与包含所有不同记录参数的.xml文件关联。每个.csv文件代表记录数据的“扫描”,因此我目前正试图找出如何将所有这些文件合并到一个大型多索引(扫描和时间)数据帧中进行处理(因为我们通常一次查看整个扫描集并找到平均值) 到目前为止,我有以下两个功能。第一种方法只是对数据帧进行一些小的修改,使其在将来更易于管理 def import_pcsv(filename): df = pd.read_csv(filename, skipiniti

我们的数据输出文件夹包含数量可变的.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
第二个是解析文件夹的真正工作。它获取文件夹中的所有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