处理 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
,此代码是未经测试的原型。
好的,所以我在处理数据框中的数据时遇到了性能问题,所以让我解释一下我的问题以及我的方法。基本上,我有一个数据框中有 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
,此代码是未经测试的原型。