2017-09-04 234 views
0

我想比较两个CSV文件中寻找共同的价值观在第1列比较两个CSV文件,

import csv 

f_d1 = open('test1.csv') 
f_d2 = open('test2.csv') 

f1_csv = csv.reader(f_d1) 
f2_csv = csv.reader(f_d2) 

for x,y in zip(f1_csv,f2_csv): 
    print(x,y) 

我想比较x [0] Y [0]。我对python相当陌生,并试图找到实现结果的最pythonic方法。这是csv文件。

test1.csv

Hadrosaurus,1.2 
Struthiomimus,0.92 
Velociraptor,1.0 
Triceratops,0.87 
Euoplocephalus,1.6 
Stegosaurus,1.4 
Tyrannosaurus Rex,2.5 

test2.csv

Euoplocephalus,1.87 
Stegosaurus,1.9 
Tyrannosaurus Rex,5.76 
Hadrosaurus,1.4 
Deinonychus,1.21 
Struthiomimus,1.34 
Velociraptor,2.72 
+0

您的示例的预期输出是什么? – DyZ

+0

你的意思是第1栏?姓名或号码? –

+0

我想输出列1中的常见项目。例如,输出将是所有值但'Deinonychus'的列表,因为它不在test2.csv中。 – FELASNIPER

回答

0

假设文件不是大得惊人,你可以用一个CSV阅读器读取他们两个,第一列转换为集,并计算交集:

with open('test1.csv') as f: 
    set1 = set(x[0] for x in csv.reader(f)) 
with open('test2.csv') as f: 
    set2 = set(x[0] for x in csv.reader(f)) 
print(set1 & set2) 
#{'Hadrosaurus', 'Euoplocephalus', 'Tyrannosaurus Rex', 'Struthiomimus', 
# 'Velociraptor', 'Stegosaurus'} 
+0

非常酷。简短和非常pythonic的方式。谢谢! – FELASNIPER

0

我添加了一行来测试每行中的数值是否是相同的。您可以修改此测试是否,例如,该值是彼此的一定距离内,在Python中defaultdict

import csv 

f_d1 = open('test1.csv') 
f_d2 = open('test2.csv') 

f1_csv = csv.reader(f_d1) 
f2_csv = csv.reader(f_d2) 

for x,y in zip(f1_csv,f2_csv): 
    if x[1] == y[1]: 
     print('they match!') 
0

乘虚而入,你可以遍历这两个文件,并像字典保持计数这

from collections import defaultdict 
d = defaultdict(list) 

for row in f1_csv: 
    d[row[0]].append(row[1]) 

for row in f2_csv: 
    d[row[0]].append(row[1]) 

d = {k: d[k] for k in d if len(d[k]) > 1} 

print(d) 

输出:

{'Hadrosaurus': ['1.2', '1.4'], 'Struthiomimus': ['0.92', '1.34'], 'Velociraptor': ['1.0', '2.72'], 
'Euoplocephalus': ['1.6', '1.87'], 'Stegosaurus': ['1.4', '1.9'], 'Tyrannosaurus Rex': ['2.5', '5.76']} 
1

我相信你正在寻找的集interse ction:

import csv 

f_d1 = open('test1.csv') 
f_d2 = open('test2.csv') 

f1_csv = csv.reader(f_d1) 
f2_csv = csv.reader(f_d2) 

x = set([item[0] for item in f1_csv]) 
y = set([item[0] for item in f2_csv]) 

print(x & y) 
+0

我的代码基于你的代码,但@ DYZ的代码比我写的更加简洁和Pythonic,所以将来你可能想要模仿他们的风格。 – camoverride

+0

很高兴我能帮上忙! – camoverride

0
import pandas as pd 
df1, df2 = pd.read_csv("test1.csv", header = None), pd.read_csv("test2.csv", header= None) 
pd.merge(df1,df2, on=0, how='inner').to_csv("result.csv", header=None, index=False)