我想在两个csv(制表符分隔)文件中计算相似和不相似条目的数量。
我一直在尝试使用python difflib来完成这项工作。 下面是两个输入文件外观的简化版本。它们很大,有很多列。
FILEA
ABC1 ABC2 SYMBOL EXCHANGE NAME ABC2 ABC3
234 f24 AAPL NYSE APPLE Inc.
23f3 ef23 ab3c jjm Google
sf2d df23 xyz tsx YourCompany
FILEB
Exchange Symbol Name
Tok aapl Apple Jap.
NYSE QUAL Qualcom inc.
NYSE GOOG Google
寻找相似性的规则:
ABC1,ABC2专栏只是为了演示目的,请在比较条目时忽略它们。
原因是,我不能单独检查名称,因为大多数公司名称在不同的交易所有不同的前缀/后缀,或者它们使用不同的语言。但交换和符号仅在这两个文件中以英文显示。
以上示例的示例输出:
FileA and FileB has 2 number of common companies.
FileA has 1 number of companies which are not in FileB
FileB has 1 number of companies which are not in FileA
我是python的新手,到目前为止我得到了差异代码,但还有很长的路要走。想把这个问题放在这里。
import difflib
diff = difflib.ndiff(open("fileA").readlines(), open("fileB").readlines())
try:
while 1:
print diff.next(),
except:
pass
答案 0 :(得分:0)
我说你需要的只是每个文件一个字典,将公司名称映射到(交换,股票代码)元组。
文件1独有的常用元素和元素:
common_elements = {}
unique_to_file_1 = {}
for key, value in file1_dict.iteritems():
if key in file2_dict.keys() or value in file2_dict.values():
common_elements[key] = value
else:
unique_to_file_1[key] = value
文件2独有的元素:
unique_to_file_2 = {}
for key, value in file2_dict.iteritems():
if key not in common_elements.keys() and value not in common_elements.values():
unique_to_file_2[key] = value
我相信您确实知道如何从CSV文件创建这两个词典。
答案 1 :(得分:0)
如果不知道您的数据是否包含重复内容以及您希望如何处理这些数据,则很难回答。
设置操作非常快,所以我建议将一个文件解析为两个集合,然后循环遍历另一个文件中的行以实现比较标准。
import csv
alist, blist = [], []
with open("fileA.tsv", "rb") as fileA:
reader = csv.reader(fileA, delimiter='\t')
for row in reader:
alist.append(row)
with open("fileB.tsv", "rb") as fileB:
reader = csv.reader(fileB, delimiter='\t')
for row in reader:
blist.append(row)
se_set_a = set([(row[2], row[3]) for row in alist])
name_set_a = set([row[4].strip() for row in alist])
symbol_exchange_matches = []
name_matches = []
for row in blist:
if (row[1], row[0]) in se_set_a:
symbol_exchange_matches.append((row[1], row[0]))
elif row[2].strip() in name_set_a:
name_matches.append(row[2])
matches = symbol_exchange_matches + name_matches
print "FileA and FileB have %i number of common companies." % (len(set(matches)),)
使用您的示例数据,我只找到一个普通公司:“Google”的名称。根据您的标准,Apple不符合。