我有两个包含重叠信息的文件(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
我认为我的问题的关键是使用两列作为键,但我不确定......我可以看到在某些情况下我可能会使用多列作为键。我应该以某种方式连接列以创建密钥吗?
答案 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")