【发布时间】:2017-10-23 01:01:55
【问题描述】:
我有两个包含重叠信息的文件(csv1 和 csv2);如果有匹配项,我想将列中的值从 csv2 复制到 csv1。
csv1 格式为:
empid, name, org, division, title, country, topic, time-on-topic
csv2 是 csv1 的一种聚合版本,但形式为:
org, country, topic, rating
我想要的结果 new_csv 是:
empid, name, org, division, title, country, topic, time-on-topic, rating
基本上,对于 csv1 和 csv2 之间的任何“国家”和“主题”匹配,将关联的“评级”复制回 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)
我认为我的问题的症结在于使用两列作为键,但我不确定......而且我可以看到在某些情况下我可能会使用多列作为键。我应该以某种方式连接列来创建键吗?
【问题讨论】:
-
考虑将 csvs 导入数据集(Stata/SAS、R 数据帧,甚至 Python pandas 数据帧)或数据库(SQLite/MS Access 是文件级 dbms),然后合并/加入这两者以获得新分配的列。不需要循环。