在Python中求CSV行的总和

2024-10-04 01:30:40 发布

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

我有一个csv文件,其中包含如下数据:

Name Value Value2 Value3 Rating
ddf  34      45    46     ok
ddf  67      23    11     ok
ghd  23      11    78     bad
ghd  56      33    78     bad
.....

我想做的是循环通过我的csv并将具有相同名称的行添加到一起,每行末尾的字符串对于该名称将始终保持不变,这样就不用担心它会更改。我如何在python中将它改成这个呢?你知道吗

Name Value Value2 Value3 Rating
ddf  101     68    57     ok
ghd  79      44    156    bad

编辑:

在我的代码中,我做的第一件事是将列表按顺序排序,以便相同的名称彼此接近,然后我尝试使用for循环通过检查第一列上的名称值是否相同来将编号的行添加到一起。这是一个非常丑陋的方式做这件事,我是在我的智囊团。你知道吗

sortedList = csv.reader(open("keywordReport.csv"))

editedFile = open("output.csv",'w')
 wr = csv.writer(editedFile, delimiter = ',')

 name = ""

 sortedList = sorted(sortedList, key=operator.itemgetter(0), reverse=True)

 newKeyword = ["","","","","",""]

for row in sortedList:   
            if row[0] != name:
                wr.writerow(newKeyword)
                name = row[0]
            else:
                newKeyword[0] = row[0] #Name
                newKeyword[1] = str(float(newKeyword[1]) + float(row[1]))
                newKeyword[2] = str(float(newKeyword[2]) + float(row[2]))
                newKeyword[3] = str(float(newKeyword[3]) + float(row[3]))

Tags: csvname名称valueokfloatrowbad
3条回答

方法很简单:

import pandas as pd

aframe = pd.read_csv('thefile.csv')

Out[19]:
Name    Value   Value2  Value3  Rating
0   ddf 34  45  46  ok
1   ddf 67  23  11  ok
2   ghd 23  11  78  bad
3   ghd 56  33  78  bad

r = aframe.groupby(['Name','Rating'],as_index=False).sum()

Out[40]:
Name    Rating  Value   Value2  Value3
0   ddf ok  101 68  57
1   ghd bad 79  44  156

如果你需要做进一步的分析和统计,熊猫会带你走很长的路而不费吹灰之力。因为这里的用例就像使用锤子杀死苍蝇,但是我想提供这个替代方案。你知道吗

你知道吗文件.csv你知道吗

Name,Value,Value2,Value3,Rating
ddf,34,45,46,ok
ddf,67,23,11,ok
ghd,23,11,78,bad
ghd,56,33,78,bad

代码

import csv

def map_csv_rows(f):
    c = [x for x in csv.reader(f)]
    return [dict(zip(c[0], map(lambda p: int(p) if p.isdigit() else p, x))) for x in c[1:]]

my_csv = map_csv_rows(open('file.csv', 'rb'))

output = {}
for row in my_csv:
    output.setdefault(row.get('Name'), {'Name': row.get('Name'), 'Value': 0,'Value2': 0, 'Value3': 0, 'Rating': row.get('Rating')})
    for val in ['Value', 'Value2', 'Value3']:
        output[row.get('Name')][val] = output[row.get('Name')][val] + row.get(val)

with open('out.csv', 'wb') as f:
    fieldnames = ['Name', 'Value', 'Value2', 'Value3', 'Rating']
    writer = csv.DictWriter(f, fieldnames = fieldnames)
    writer.writeheader()
    for out in output.values():
        writer.writerow(out)

为了便于比较,等效的awk程序

$ awk -v OFS="\t" '
     NR==1{$1=$1;print;next} 
          {k=$1;a[k]+=$2;b[k]+=$3;c[k]+=$4;d[k]=$5} 
       END{for(i in a) print i,a[i],b[i],c[i],d[i]}' input

将打印

Name    Value   Value2  Value3  Rating
ddf     101     68      57      ok
ghd     79      44      156     bad

如果是csv输入,而您想要csv输出,则需要添加-F,参数并更改为OFS=,

相关问题 更多 >