繁体   English   中英

在 Python 中总结 CSV 行

[英]Summating CSV rows in 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]))

熊猫的方式很简单:

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

如果您需要做进一步的分析和统计,Pandas 将带您走很长的路。 对于这里的用例,就像用锤子杀死苍蝇一样,但我想提供这种替代方法。

文件.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=,

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM