我有一个包含6列和450万行的数据集,我想遍历所有数据集以比较数据集中每一行的最后一列的值与第一列的值并将最后一列的值与该行的第一列的值匹配的行附加到该行。
我想到的第一个解决方案是使用pandas的.iter
,但我认为对于大型数据集来说这太慢了。
假设这是我的数据集:
x = [['2', 'Jack', '8'],['1', 'Ali', '2'],['4' , 'sgee' , '1'],
['5' , 'gabe' , '2'],['100' , 'Jack' , '6'],
['7' , 'Ali' , '2'],['8' , 'nobody' , '20'],['9' , 'Al', '10']]
结果应如下所示:
[['2', 'Jack', '8', '1', 'Ali', '2', '5' , 'gabe' , '2','7' , 'Ali' , '2'],
['1', 'Ali', '2', '4' , 'sgee' , '1'],
['8' , 'nobody' , '20', '2', 'Jack', '8']]
我尝试过的代码是:
for line in x:
arow=line
for row in x:
brow=row
if line[2]==row[0]:
brow.extend(arow)
table.append(brow)
print(table)
但结果似乎重复:
[['8', 'nobody', '20', '2', 'Jack', '8'],
['2', 'Jack', '8', '1', 'Ali', '2', '5', 'gabe', '2', '7', 'Ali', '2'],
['1', 'Ali', '2', '4', 'sgee', '1'],
['2', 'Jack', '8', '1', 'Ali', '2', '5', 'gabe', '2', '7', 'Ali', '2'],
['2', 'Jack', '8', '1', 'Ali', '2', '5', 'gabe', '2', '7', 'Ali', '2']]
答案 0 :(得分:1)
您可以尝试使用defaultdict
:
from collections import defaultdict
from pprint import pprint
x = [['2', 'Jack', '8'],['1', 'Ali', '2'],['4' , 'sgee' , '1'],
['5' , 'gabe' , '2'],['100' , 'Jack' , '6'],
['7' , 'Ali' , '2'],['8' , 'nobody' , '20'],['9' , 'Al', '10']]
d = defaultdict(list)
for v in x:
d[v[0]] += v
d[v[-1]] += v
pprint([v for v in d.values() if len(v) > 3])
打印:
[['2', 'Jack', '8', '1', 'Ali', '2', '5', 'gabe', '2', '7', 'Ali', '2'],
['2', 'Jack', '8', '8', 'nobody', '20'],
['1', 'Ali', '2', '4', 'sgee', '1']]
答案 1 :(得分:1)
您可以尝试使用numpy,但这需要大约10分钟的时间。
import numpy as np
import time
x = [['2', 'Jack', '8'],['1', 'Ali', '2'],['4' , 'sgee' , '1'],
['5' , 'gabe' , '2'],['100' , 'Jack' , '6'],
['7' , 'Ali' , '2'],['8' , 'nobody' , '20'],['9' , 'Al', '10']]
xArr = np.array(x)
st = time.time()
newList = []
for kk,i in enumerate(xArr):
matches = np.where(xArr[:,-1]==i[0])[0]
if len(matches)!=0:
newList.append(np.concatenate([i,xArr[matches].flatten()]))
print('Runtime',time.time() - st)