处理 DataFrame 时的性能问题

performance problem when dealing with DataFrames

好的,所以我在处理数据框中的数据时遇到了性能问题,所以让我解释一下我的问题以及我的方法。基本上,我有一个数据框中有 200 行和 3 列的数据集,每列可以接受多个可能值中的 1 个。现在我想构建一个新的数据框,我将原始数据集中的每个 ID 附加到 3 列的每个可能值。然后,我想添加一个具有不同值的新列,如下所示:对于新数据框中的每一行,我将检查原始数据集,如果该行存在(该 ID 具有该值),那么我将输入一些值,否则,我将输入另一个值。这就是我的问题的表述,我希望它很清楚。现在这是我执行此操作的方法:

for i in dataset['ID']:
    for j in dataset:
        if j != 'ID':
            if  j=='col1':
                key = dataset.iloc[i-1][j]
                new_dataset = new_dataset.append({'ID' :str(i), 'col_val' 
                :str(key), 'value' :x},  
                ignore_index = True)

                for d in col1_unique:
                    if str(d) != str(key):
                        new_dataset = new_dataset .append({'ID' :str(i), 
                        'col_val' :d, 'value' :y},  
                        ignore_index = True) 
            
            elif  j=='col2':
                key = dataset.iloc[i-1][j]
                new_dataset = new_dataset .append({'ID' :str(i), 'col_val' :key, 
                'value' :x},  
                    ignore_index = True)
                
                for d in col2_unique:
                    if str(d) != str(key):
                        new_dataset = new_dataset .append({'ID' :str(i), 
                        'col_val' :d, 'value' :y},  
                            ignore_index = True)

            else:
                key = dataset.iloc[i-1][j]
                new_dataset = new_dataset .append({'ID' :str(i), 'col_val' :key, 
                'vlue' :x},  
                    ignore_index = True)

                for d in col3_unique:
                    if str(d) != str(key):
                        new_dataset = new_dataset.append({'ID' :str(i), 
                        'col_val' :d, 'value' :y},  
                        ignore_index = True)

现在,这一切正常,但问题是性能低下。对于小数据集(例如 200 行),它可能很快,但对于更大的数据集,它最多可能需要 5 分钟。我尝试了不同的方法来提高性能,例如逐行读取它并访问该行的值而不是从整个数据集调用它,但这并没有提高多少。因此,欢迎您分享任何提高性能的想法。 提前致谢。

不要在数据帧上迭代调用append:这是非常低效的,因为它为添加的每个新行创建一个全新的数据帧,导致O(n**2)追加。

此外,您可以分解代码,这样就不会一次又一次地重新计算表达式。事实上,Python 解释器不是很聪明,它不会为你优化。

下面是生成的代码,应该会快得多:

import pandas as pd

newDf_IDs = []
newDf_colVals = []
newDf_values = []

for i in dataset['ID']:
    iStr = str(i)
    for j in dataset:
        if j != 'ID':
            key = dataset.iloc[i-1][j]
            keyStr = str(key)

            if  j=='col1':
                newDf_IDs.append(iStr)
                newDf_colVals.append(keyStr)
                newDf_values.append(x)
                uniqueCol = col1_unique
            elif  j=='col2':
                newDf_IDs.append(iStr)
                newDf_colVals.append(key)
                newDf_values.append(x)
                uniqueCol = col2_unique
            else:
                newDf_IDs.append(iStr)
                newDf_colVals.append(key)
                newDf_values.append(x)
                uniqueCol = col3_unique

            for d in uniqueCol:
                if str(d) != keyStr:
                    newDf_IDs.append(iStr)
                    newDf_colVals.append(d)
                    newDf_values.append(y)

new_dataset = pd.DataFrame({'ID': newDf_IDs, 'col_val': newDf_colVals, 'value': newDf_values})

PS:请注意,我修正了一个拼写错误 vlue,此代码是未经测试的原型。