搜索特定的行组合

时间:2019-09-12 11:37:06

标签: python csv

我正在使用csv编写器/阅读器库。给出csv示例:

a,x,1
a,y,1
b,z,y
a,c,1
a,x,5
b,x,y

如何让python搜索并返回row [0]和row [2]的组合出现多次的地方?即应返回a,x,1 + a,y,1 + a,c,1作为一个匹配项,并返回b,z,y + b,x,y作为另一个匹配项。

我了解如何让python打开文本文件,然后让它将当前行与上一行进行比较以查看其是否匹配。但是,匹配显然可能在文件中的任何位置,我不确定该怎么做。

提前致谢

2 个答案:

答案 0 :(得分:3)

您可以使用defaultdict字典,并使用(first, last)的元组作为键,并且将第一个元素和最后一个元素为(first, last)的行列表作为值:

import csv
from collections import defaultdict

result = defaultdict(list)

with open("data.csv", "r") as f:
    reader = csv.reader(f)
    for d in reader:
        result[(d[0], d[-1])].append(d)

print(result)

输出:

defaultdict(<class 'list'>,
 {
  ('a', '1'): [['a', 'x', '1'], ['a', 'y', '1'], ['a', 'c', '1']],
  ('b', 'y'): [['b', 'z', 'y'], ['b', 'x', 'y']],
  ('a', '5'): [['a', 'x', '5']]
 }
)

答案 1 :(得分:1)

您可以使用熊猫:

import pandas as pd
df = pd.read_csv('./xxx.csv', header=None, names=['c1','c2','c3'])
g = df.groupby(by=['c1','c3']).filter(lambda x: len(x)>1).groupby(by=['c1','c3'])
d = {k:v.values.tolist() for k,v in dict(list(g)).items()}

输出

d
{('a', '1'): [['a', 'x', '1'], ['a', 'y', '1'], ['a', 'c', '1']],
 ('b', 'y'): [['b', 'z', 'y'], ['b', 'x', 'y']]}