如何比较2个CSV文件,检查第二列的值是否匹配,并在匹配时计算每个值的出现次数



我想遍历两个CSV文件,检查两个文件中的值何时匹配,并计算匹配时每个值出现的次数。输出应该是一个字典。

所以我有两个对齐的CSV文件。每个都有两列:"WORD"one_answers"POS"(词性标签(。单击查看文件1的示例点击查看文件2 的示例

在某些情况下,两个文件中的每个单词都以相同的方式标记,但在许多其他情况下却没有。我想计算一下两个文件以相同方式标记的次数。

例如,如果file1有WORD"human"和POS"PERS",而file2也有WORD"human"和POS"PERS",我希望输出为:{PERS:2}这意味着PERS在两个文件中都匹配了两次。我希望每个标签都这样:{TAG1:n次出现并匹配两者,TAG2:出现并匹配二者,等等}

我只能想出如何读取一个CSV文件,并使用以下代码计算每个POS标签的使用次数:

import csv 
from collections import defaultdict

def count_NER_tags(filename): 
"""
Obtains the counts of each tag for the determined csv file  
"""
dict_NER_counts = defaultdict(int) 
with open(filename, "r") as csvfile:
read_csv = csv.reader(csvfile, delimiter="t")
next(read_csv) #skip the header 
for row in read_csv:
dict_NER_counts[row[2]] += 1
return dict_NER_counts

output: 
{'O': 42123, 'ORG': 2092, 'LOC': 2094, 'MISC': 1268, 'PERS': 3145}

我不知道如何在阅读了两个CSV文件后实现"if POS in file1==POS in file2",然后将它们的计数添加到字典中,如上面的代码所示。

我觉得有点奇怪,当同一个WORD在两个文件中都有相同的POS时,你称它为两个匹配而不是一个——在我看来,这只是一个匹配。

不管怎样。。。我认为以下内容会满足你的需求(如果我正确理解了你的需求(。

import csv
from collections import defaultdict
def count_tag_matches(filename1, filename2):
"""
Counts the number of tags that had the same value in both CSV files.
"""
dict_counts = defaultdict(int)
with open(filename1, "r", newline='') as csvfile1, 
open(filename2, "r", newline='') as csvfile2:
reader1 = csv.DictReader(csvfile1, delimiter="t")
reader2 = csv.DictReader(csvfile2, delimiter="t")
for row1, row2 in zip(reader1, reader2):
if row1['POS'] == row2['POS']:
dict_counts[row1['POS']] += 2
return dict(dict_counts)  # Return a regular dictionary.
counts = count_tag_matches('cmp_file1.csv', 'cmp_file2.csv')
print(counts)

处理样本文件的输出:

{'A': 2, 'O': 2, 'PERS': 2}
  1. 使用pandas.Read_csv((以csv的形式读取这两个文件
  2. 合并两个数据帧
  3. POS分组并计算行数
  4. 从聚合数据帧创建字典

代码看起来像这个

import pandas as pd
df1 = pd.read_csv('path to file 1')
df2 = pd.read_csv('path to file 2')
# As column names are same it would be merged on both the columns
df_merged = df1.merge(df2)
#Count occurrences of `WORD` grouped by `POS`
df_merged = df_merged.groupby(['POS']).count().reset_index()
tags_dict = dict(zip(df_merged['POS'], df_merged['WORD']))

希望这能有所帮助!

相关内容

  • 没有找到相关文章

最新更新