【问题标题】:How to compare two columns from the same data set?如何比较同一数据集中的两列?
【发布时间】:2019-07-04 22:03:50
【问题描述】:

我有一个包含 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']]

【问题讨论】:

  • 你试过了吗?
  • 你需要它运行多快?
  • @张海峰。是的!我编辑了我的问题。谢谢你提醒我。如您所见,我的结果重复

标签: python


【解决方案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)

【讨论】:

  • 这可行,但还会在每个列表的末尾添加一个dtype='<U6'。你能解释一下它是什么吗?非常感谢!
  • 它只是数据类型(它是小端序 (docs.scipy.org/doc/numpy-1.10.0/reference/…
  • 您的代码可以完美地处理较小的数据集,但我的计算机因“内存错误”而崩溃。我有一台 12 GB 的计算机,我的数据集约为 650 MB。你有什么建议吗?
  • 在什么阶段停止工作?转换为数组或运行循环时。如果是后者,您可以将结果保存到文本文件中。如果是前者,您可以尝试使用 memmap 吗?可能您需要同时使用两者。
【解决方案2】:

你可以试试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']]

【讨论】:

  • 此代码有效!谢谢你。你能解释一下“if len(v) > 3”是做什么的吗?谢谢!
  • @Pie-ton 3 是列数(在这种情况下)。我想过滤掉没有任何匹配的结果。
猜你喜欢
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多