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

时间:2017-10-23 01:01:55

标签: python csv

我有两个包含重叠信息的文件(csv1和csv2);在有匹配的地方,我想将列中的值从csv2复制到csv1。

csv1的形式为:

select count(qty) as "noc", pd.pid, pd.name 
from purchases p 
  inner join products pd on pd.pid = p.pid 
where (to_char(p.ptime, 'Mon-YYYY')='Oct-2017' 
  AND p.qty =p.qty

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

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

我想要的结果new_csv是:

org, country, topic, rating

基本上,对于csv1和csv2之间的“country”和“topic”的任何匹配,将关联的“rating”复制回csv1结构到新文件csv3中。我很尴尬地承认我花了很多时间在留言板上搜索字典,元组和列表,到目前为止我只能使用一列作为键才能使它工作。 2列可以作为关键吗?或者我问错了问题?

这是我到目前为止所做的事情,但以'empid'为关键:

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

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

2 个答案:

答案 0 :(得分:0)

下面是一些应该做你想做的代码:

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中的性能很奇怪)但可能不太容易出错。

答案 1 :(得分:0)

根据使用数据帧的建议,我最终基于pd.merge()实现了以下脚本。

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")