我有两个文件(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)
我认为我问题的关键是使用两列作为键,但我不确定……而且我可以看到在某些情况下,我可能会使用多个列作为键。我应该以某种方式连接列来创建键吗?在
根据关于使用数据帧的建议,我最终实现了以下基于pd合并(). 在
下面是一些可以实现您所需的代码:
这个问题的主要逻辑变化是,这里我们使用一个二元组作为键(根据要求,特定的二元组表示国家、主题)。在
但是也有很多其他的清理,而不是拆分然后重新合并行,我们也保留了值中的“关键”部分。这种冗余使得编写代码更加简单。在
索引已更改为常量,以便更清楚地知道需要哪些字段。最后,将“if”语句替换为get方法调用,该方法将返回一个新列表。这看起来像是虚假的开销,但它不太可能较慢(甚至可能更快,Python中的性能很奇怪),但可能不太容易出错。在
相关问题 更多 >
编程相关推荐