【发布时间】:2021-09-20 21:31:39
【问题描述】:
我正在尝试在具有 170 万行和 4 个变量的表上使用基本 python 进行非 equi 自连接。 数据如下所示:
product position_min position_max count_pos
A.16 167804 167870 20
A.18 167804 167838 15
A.15 167896 167768 18
A.20 238359 238361 33
A.35 167835 167837 8
这里是我使用的代码:
import csv
from collections import defaultdict
import sys
import os
list_csv=[]
l=[]
with open(r'product.csv', 'r') as file1:
my_reader1 = csv.reader(file1, delimiter=';')
for row in my_reader1:
list_csv.append(row)
with open(r'product.csv', 'r') as file2:
my_reader2 = csv.reader(file2, delimiter=';')
with open('product_p.csv', "w") as csvfile_write:
ecriture = csv.writer(csvfile_write, delimiter=';',
quotechar='"', quoting=csv.QUOTE_ALL)
for row in my_reader2:
res = defaultdict(list)
for k in range(len(list_csv)):
comp= list_csv[k]
try:
if int(row[1]) >= int(comp[1]) and int(row[2]) <= int(comp[2]) and row[0] != comp[0]:
res[row[0]].append([comp[0],comp[3]])
except:
pass
if bool(res):
for key, value in res.items():
sublists = defaultdict(list)
for sublist in value:
l=[]
sublists[sublist[0]].append(int(sublist[1]))
l.append(str(key) + ";"+ str(min(sublists.keys(), key=(lambda k: sublists[k]))))
ecriture.writerow(l)
我应该在“product_p.csv”文件中得到这个:
'A.18'; 'A.16'
'A.15'; 'A.18'
'A.35'; 'A.18'
代码所做的是两次读取同一个文件,第一次完全读取,并将其转换为列表,第二次逐行查找,即为每个产品(第一个变量)查找所有产品根据 position_min 和 position_max 的条件,它属于哪个,然后通过保留 count_pos 最小值的产品只选择一个。
我在原始数据样本上进行了尝试,它可以工作,但是有 170 万行,它运行了几个小时而没有给出任何结果。 有没有办法用我们的或更少的循环来做到这一点?任何人都可以帮助使用基本的 python 库来优化它吗?
提前谢谢你
【问题讨论】:
-
你能大致解释一下,你的代码在做什么吗?我不明白你的代码到底在做什么!
-
@Kshitiz 感谢您的回答。代码所做的是两次读取同一个文件,第一次完全读取,并将其转换为列表,第二次逐行读取,即为每个产品(第一个变量)查找它所属的所有产品根据 position_min 和 position_max 的条件,然后通过保留 count_pos 最小值的产品只选择一个。
-
你不是说你想得到这个
A16 A35,但实际上你得到的是A35 A16,这是否可以? -
@Kshitiz,我更正了编译代码时应该得到的内容。
-
现在我也不完全明白你想要做什么,但我曾尝试在
pandas中做,但熊猫的速度也比你的代码更差。我已经用 2000 个数据集进行了测试,但是你的代码比我的快。如果我完全了解您在做什么,那么我也可以尝试其他方法!而且我在您的代码中注意到,您不必为完全相同的数据读取该文件 2 次,您可以在第二次使用以前的数据。我没有检查这是否会使您的代码更快,但我注意到了
标签: python loops optimization