Igor
Igor

Reputation: 319

Python sort and sum CSV

I have CSV file like this:

Datetime, Usage1, Project1
Datetime, Usage2, Project1
Datetime, Usage3, Project2
Datetime, Usage4, Project3

Goal is to summarize Usage per Project and have a report like this:

Project1: Usage1 Usage2

Project2: Usage3

Project3: Usage4

I started with the following Python code, however it is not working properly:

#/usr/bin/python

# obtain all Project values into new list project_tags:

project_tags = []
ifile = open("file.csv","r")
reader = csv.reader(ifile)
headerline = ifile.next()
for row in reader:
    project_tags.append(str(row[2]))
ifile.close()

# obtain sorted and unique list and put it into a new list project_tags2
project_tags2 = []
for p in list(set(project_tags)):
    project_tags2.append(p)


# open CSV file again and compare it with new unique list
ifile2 = open("file.csv","r")
reader2 = csv.reader(ifile2)
headerline = ifile2.next()

# Loop through both new list and a CSV file, and if they matches sum it:

sum_per_project = sum_per_project + int(row[29])
for project in project_tags2:
    for row in reader2:
        if row[2] == project:
            sum_per_project = sum_per_project + int(row[1])

Any input is appreciated!

Thanks in advance.

Upvotes: 2

Views: 206

Answers (2)

Bahrom
Bahrom

Reputation: 4862

Here's an approach with a defaultdict.

Edit: Thanks to @Saleem's for reminding me of with clause, and that we just need to output the contents

from collections import defaultdict
import csv

summary = defaultdict(list)
with open(path, "r") as f:
    rows = csv.reader(f)
    header = rows.next()
    for (dte, usage, proj) in rows:
        summary[proj.strip()]+=[usage.strip()]

# I just realized that all you needed to do was output them:
for proj, usages in sorted(summary.iteritems()):
    print(
        "%s: %s" % (proj, ' '.join(sorted(usages)))
    )

Will print

Project1: Usage1 Usage2
Project2: Usage3
Project3: Usage4

Upvotes: 0

Saleem
Saleem

Reputation: 8978

Try following snippet:

summary = {}

with open("file.csv", "r") as fp:
    for line in fp:
        row = line.rstrip().split(',')

        key = row[2]
        if key in summary:
            summary[key] += (row[1].strip(),)
        else:
            summary[key] = (row[1].strip(),)

for k in summary:
    print('{0}: {1}'.format(k, ' '.join(summary[k])))

Based on your sample data in csv file, it will print:

 Project1: Usage1 Usage2
 Project2: Usage3
 Project3: Usage4

Upvotes: 1

Related Questions