簡體   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