2017-09-04 242 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)