我正在使用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打开文本文件,然后让它将当前行与上一行进行比较以查看其是否匹配。但是,匹配显然可能在文件中的任何位置,我不确定该怎么做。
提前致谢
答案 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']]}