根据其他CSV中的两个不同列添加到CSV中的行值

时间:2014-12-11 14:50:34

标签: python csv

提前感谢您的帮助。

我正在尝试获取一个csv文件,其中包含特定日期的特定ID的相对频率列表,并按日期合并所有数据,以便第二个CSV文件具有唯一日期列表和合并的相对频率该日期的每个ID。

第一个CSV文件(具有重复日期)如下所示:

ID,Date,Relfreq
CR,10061,9.01E-07
CR,10061,9.01E-07
TPN,10062,5.42782E-06
TPN,10062,8.14173E-06
TPN,10062,5.42782E-06
TPN,10062,8.14173E-06
TPN,10062,0.000179118
CR,10062,7.02E-07
CR,10062,1.05307E-06
CR,10062,7.02E-07
CR,10062,1.75512E-06
CR,10062,1.05307E-06
TPN,10070,1.99831E-05
TPN,10070,9.99156E-06

第二个CSV文件(只有唯一日期)如下所示:

Date,TPN,CR
10050,0,0
10051,0,0
10052,0,0
10060,0,0
10061,0,0
10062,0,0
10070,0,0
10071,0,0
10072,0,0

我需要脚本查看第一个文件,并为每个日期添加每个ID的所有相对频率。因此,例如,它应该添加Relfreq下具有ID" CR"的所有值。和日期" 10062"并且它应该单独添加Relfreq下具有ID" TPN"的所有值。和日期" 10062。"然后我希望它看第二个文件并找到" 10062"并将TPN Relfreqs的总和添加到第2列(标记为" TPN")和CR Relfrews总和到第3列(标记为" CR")。

我已经编写了以下脚本,但我不确定它实际上是在做我想要的,并且会在下面打印出错误:

import unicodecsv
import csv
import io
import math 
from decimal import *

alist, blist = [], []

with open("wholetopic.csv", "rU") as fileA:
    reader = csv.reader(fileA, delimiter=',')
    for row in reader:
        alist.append(row)
with open("date.csv", "rU") as fileB:
    reader = csv.reader(fileB, delimiter=',')
    for row in reader:
        blist.append(row)

TPNlist, CRlist = [],[]

c = csv.writer(open("finaltopic.csv", "a"))
for brow in blist:
    dateB = brow[0]
    for arow in alist:
        dateA = arow[1]
        ID = arow[0]
        RF = arow[2]
        if dateB == dateA:
            if ID == "TPN":
                TPNlist.append(RF)
            else:
                if ID == "CR":
                    CRlist.append(RF)
                    continue
        TPNsum = sum(TPNlist)
        CRsum = sum(CRlist)
        values = dateB,TPNsum,CRsum
        c.writerow(values)                                   

print "Done!"

这是错误:

  File "consolidatedates.py", line 34, in <module>
    TPNsum = sum(TPNlist)
TypeError: unsupported operand type(s) for +: 'int' and 'str'

2 个答案:

答案 0 :(得分:0)

TPNlist.append(的(RF))
CRlist.append(的(RF))

答案 1 :(得分:0)

该错误表明您尝试将int添加到string,但Python不支持此功能。

您可以在追加时尝试将RF的值转换为int,例如:

TPNlist.append(int(RF))

如果RF已经是int,请不要担心,如果它是"10"或其他什么,可以解决您的问题。但是,如果RF包含字母或非字母数字值(例如'',例如,如果该行的该列在源文件中没有值),您将收到类似的错误这样:

ValueError: invalid literal for int() with base 10: ''

在这种情况下,您需要确保源文件格式正确,或者您要引用正确的行。