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

2024-06-16 14:44:33 发布

您现在位置:Python中文网/ 问答频道 /正文

事先谢谢你的帮助。你知道吗

我试图采取一个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 Relfreq的和添加到第二列(标记为“TPN”)和第3列(标记为“CR”)的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'

Tags: 文件csvinimportidforreader频率
2条回答

该错误表示您正试图将int添加到string,这在Python中不受支持。你知道吗

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

TPNlist.append(int(RF))

如果RF已经是一个int,不用担心,如果是"10"或者别的什么,可以解决你的问题。但是,如果RF包含字母或非字母数字值(如'',例如,如果行的该列在源文件中没有值),则会出现如下错误:

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

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

你知道吗TPNlist.append文件(浮动(RF))
CRlist.append文件(浮动(RF))

相关问题 更多 >