我正在预处理一个大型数据框以进行分析。
基本上,我试图在列中查找最大数或接近最大数(“ close”定义为大于0.9*largest number
),并用1
标记它,而其他位置保留为{{ 1}},
即,如果某列包含0
,则应将其转换为[25, 3, 5, 24, 0]
。我编写的代码以某种方式永远需要运行。
我写了一个简单的列表理解来逐列清除数据。对于前2,000列,该代码花费了不到1秒的时间。但是,当我将列数增加到10,000时,它变得非常缓慢并且花了半个多小时。最终,我想在500万行的数据集上运行此代码,是否应该更改某些错误以提高其效率?
[1,0,0,1,0]
我的数据结构知识有限,是否有明显的遗漏之处?
答案 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