如何改善这种简单的数据清理代码的运行时间?

时间:2019-04-17 06:03:40

标签: python numpy data-cleaning

我正在预处理一个大型数据框以进行分析。 基本上,我试图在列中查找最大数或接近最大数(“ close”定义为大于0.9*largest number),并用1标记它,而其他位置保留为{{ 1}}, 即,如果某列包含0,则应将其转换为[25, 3, 5, 24, 0]。我编写的代码以某种方式永远需要运行。

我写了一个简单的列表理解来逐列清除数据。对于前2,000列,该代码花费了不到1秒的时间。但是,当我将列数增加到10,000时,它变得非常缓慢并且花了半个多小时。最终,我想在500万行的数据集上运行此代码,是否应该更改某些错误以提高其效率?

[1,0,0,1,0]

我的数据结构知识有限,是否有明显的遗漏之处?

2 个答案:

答案 0 :(得分:0)

在列表理解步骤之前找到列的最大值,并且仅通过列名进行迭代。

import pandas as pd
temp_dataset_1 = pd.DataFrame({'A':[25,3,5,25,0,1,2], 'B':[20, 21, 19, 18,17,25,26]})
for col in list(temp_dataset_1):
    compare_val = temp_dataset_1[col].max()*.9
    temp_dataset_1[col] = [1 if i >= compare_val else 0 for i in temp_dataset_1[col]]

原始数据框:

   A   B
0  25  20
1   3  21
2   5  19
3  25  18
4   0  17
5   1  25
6   2  26

更改值后:

   A  B
0  1  0
1  0  0
2  0  0
3  1  0
4  0  0
5  0  1
6  0  1

答案 1 :(得分:0)

尝试使用numpy尝试这种方法:

import time
import pandas as pd
import numpy as np

# Create fake data (this should take around 9s)
tic = time.time()
value2 = []
for x in range(10000):
    value1 = []
    for y in range(10000):
        value1.append(x)
    value2.append(value1)

print(time.time() - tic)
tic = time.time()
temp_dataset_1 = pd.DataFrame(value2)


for col in temp_dataset_1.iloc[:,:10]:
    max_value = max(temp_dataset_1[col])
    a = np.array(temp_dataset_1[col].values.tolist())
    temp_dataset_1[col] = np.where(a >= max_value*.9, 1, 0).tolist()

print(temp_dataset_1.shape)
toc = time.time() - tic
print('Calculating 10,000 out of 5,810,172 rows took %d seconds' %toc)

对于10K x 10K矩阵,时间为19秒:

Calculating 10,000 out of 5,810,172 rows took 19 seconds