匹配CSV中的多个列;如果相等,将值从一个CSV复制到另一个CSV

2024-05-19 08:57:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个文件(csv1和csv2),它们包含重叠的信息;如果有匹配项,我希望将列中的值从csv2复制到csv1。在

csv1的形式为:

empid, name, org, division, title, country, topic, time-on-topic

csv2是csv1的聚合版本,但其形式为:

^{pr2}$

我想要的结果,new_csv,是:

empid, name, org, division, title, country, topic, time-on-topic, rating

基本上,对于csv1和csv2之间的“country”和“topic”的匹配,将相关联的“rating”复制回csv1结构到一个新文件csv3中。我很不好意思地承认,我花了很多时间在留言板上搜索字典、元组和列表,到目前为止,只有使用一列作为键才能使其正常工作。2列可以作为键吗?还是我问错了问题?在

到目前为止,我一直在做的,但关键是“empid”:

with open('csv1.csv', 'r') as f:
    first = {rows[0]: rows[1:] for rows in list(csv.reader(f))}

with open('csv2.csv', 'r') as f:
    for row in csv.reader(f):
        if row[0] in first: # row[0] = url
            first[row[0]].append(row[2])

merged = [(k,) + tuple(v) for k, v in first.items()]

with open('output.csv', 'w') as f:
    csv.writer(f).writerows(merged)

我认为我问题的关键是使用两列作为键,但我不确定……而且我可以看到在某些情况下,我可能会使用多个列作为键。我应该以某种方式连接列来创建键吗?在


Tags: 文件csvinfortopicaswithopen
2条回答

根据关于使用数据帧的建议,我最终实现了以下基于pd合并(). 在

df1 = pd.read_csv('csv1.csv')
df2 = pd.read_csv('csv2.csv')
result = pd.merge(df1, df2, on = ['empid', 'name', 'org', 'division', 'title', 'country', 'topic', 'time-on-topic'], how = 'right')
result.to_csv("output.csv")

下面是一些可以实现您所需的代码:

COUNTRY_CSV1, TOPIC_CSV = 5, 6

with open('csv1.csv', 'r') as f:
    first = {(rows[COUNTRY_CSV1], rows[TOPIC_CSV1]): 
             rows for rows in list(csv.reader(f))}

COUNTRY_CSV2, TOPIC_CSV2, RATING_CSV2 = 1, 2, 3
with open('csv2.csv', 'r') as f:
    for row in csv.reader(f):
        key = row[COUNTRY_CSV2], row[TOPIC_CSV2]
        first.get(key, []).append(row[RATING_CSV2]

with open('output.csv', 'w') as f:
    csv.writer(f).writerows(first.values())

这个问题的主要逻辑变化是,这里我们使用一个二元组作为键(根据要求,特定的二元组表示国家、主题)。在

但是也有很多其他的清理,而不是拆分然后重新合并行,我们也保留了值中的“关键”部分。这种冗余使得编写代码更加简单。在

索引已更改为常量,以便更清楚地知道需要哪些字段。最后,将“if”语句替换为get方法调用,该方法将返回一个新列表。这看起来像是虚假的开销,但它不太可能较慢(甚至可能更快,Python中的性能很奇怪),但可能不太容易出错。在

相关问题 更多 >

    热门问题