Reputation: 223
@StackOverflow I have a script which appends two column counts to the end of a csv.
import csv
import datetime
import copy
from collections import defaultdict
with open(r"TestSingleParaSR.csv") as i, open(r"TestSingleParaSRResuls.csv", "wb") as o:
rdr = csv.reader(i)
wrt = csv.writer(o)
data, currdate = defaultdict(lambda:[0, 0, 0, 0]), None
for line in rdr:
date, name = datetime.datetime.strptime(line[0], '%d/%m/%Y'), line[7]
if date != currdate or not currdate:
for v in data.itervalues():
#print v[:2]
#print v[2:]
#print "\n"
v[:2] = v[2:]
currdate = date
wrt.writerow(line + data[name][:2])
data[name][3] += 1
if line[6] == "1": data[name][2] += 1
This code works on a csv such as this:
02/01/2005,Data,Class xpv,4,11yo+,4,1,George Smith
02/01/2005,Data,Class xpv,4,11yo+,4,2,Ted James
02/01/2005,Data,Class xpv,4,11yo+,4,3,Emma Lilly
02/01/2005,Data,Class xpv,4,11yo+,4,5,George Smith
02/01/2005,Data,Class tn2,4,10yo+,6,4,Tom Phillips
03/01/2005,Data,Class tn2,4,10yo+,6,2,Tom Phillips
03/01/2005,Data,Class tn2,4,10yo+,6,5,George Smith
03/01/2005,Data,Class tn2,4,10yo+,6,3,Tom Phillips
03/01/2005,Data,Class tn2,4,10yo+,6,1,Emma Lilly
03/01/2005,Data,Class tn2,4,10yo+,6,6,George Smith
04/01/2005,Data,Class tn2,4,10yo+,6,6,Ted James
04/01/2005,Data,Class tn2,4,10yo+,6,3,Tom Phillips
04/01/2005,Data,Class tn2,4,10yo+,6,2,George Smith
04/01/2005,Data,Class tn2,4,10yo+,6,4,George Smith
04/01/2005,Data,Class tn2,4,10yo+,6,1,George Smith
04/01/2005,Data,Class tn2,4,10yo+,6,5,Tom Phillips
05/01/2005,Data,Class 22zn,2,10yo+,5,3,Emma Lilly
05/01/2005,Data,Class 22zn,2,10yo+,5,1,Ted James
05/01/2005,Data,Class 22zn,2,10yo+,5,2,George Smith
05/01/2005,Data,Class 22zn,2,10yo+,5,4,Emma Lilly
05/01/2005,Data,Class 22zn,2,10yo+,5,5,Tom Phillips
and returns this:
02/01/2005,Data,Class xpv,4,11yo+,4,1,George Smith,0,0
02/01/2005,Data,Class xpv,4,11yo+,4,2,Ted James,0,0
02/01/2005,Data,Class xpv,4,11yo+,4,3,Emma Lilly,0,0
02/01/2005,Data,Class xpv,4,11yo+,4,5,George Smith,0,0
02/01/2005,Data,Class tn2,4,10yo+,6,4,Tom Phillips,0,0
03/01/2005,Data,Class tn2,4,10yo+,6,2,Tom Phillips,0,0
03/01/2005,Data,Class tn2,4,10yo+,6,5,George Smith,1,2
03/01/2005,Data,Class tn2,4,10yo+,6,3,Tom Phillips,0,0
03/01/2005,Data,Class tn2,4,10yo+,6,1,Emma Lilly,0,1
03/01/2005,Data,Class tn2,4,10yo+,6,6,George Smith,1,2
04/01/2005,Data,Class tn2,4,10yo+,6,6,Ted James,0,1
04/01/2005,Data,Class tn2,4,10yo+,6,3,Tom Phillips,1,2
04/01/2005,Data,Class tn2,4,10yo+,6,2,George Smith,1,4
04/01/2005,Data,Class tn2,4,10yo+,6,4,George Smith,1,4
04/01/2005,Data,Class tn2,4,10yo+,6,1,George Smith,1,4
04/01/2005,Data,Class tn2,4,10yo+,6,5,Tom Phillips,0,3
05/01/2005,Data,Class 22zn,2,10yo+,5,3,Emma Lilly,1,2
05/01/2005,Data,Class 22zn,2,10yo+,5,1,Ted James,0,2
05/01/2005,Data,Class 22zn,2,10yo+,5,2,George Smith,2,7
05/01/2005,Data,Class 22zn,2,10yo+,5,4,Emma Lilly,1,2
05/01/2005,Data,Class 22zn,2,10yo+,5,5,Tom Phillips,0,5
I want to be able to append three columns to the end of this csv, the third being column 8 divided by column 9 (obviously putting a 0 in if column 8 = 0)
I have tried to work out how to do this myself, hence the commented out prints in the script. But I cannot workout what the function wrt.writerow.
Any ideas how to achieve what I desire. As an example last 3 rows of the csv would then read:
05/01/2005,Data,Class 22zn,2,10yo+,5,2,George Smith,2,7,0.28572814
05/01/2005,Data,Class 22zn,2,10yo+,5,4,Emma Lilly,1,2,0.5
05/01/2005,Data,Class 22zn,2,10yo+,5,5,Tom Phillips,0,5,0
Upvotes: 0
Views: 64
Reputation: 12326
Here is a modification of your script with a few lines added to calculate the quotient. Since you already are working with the values for the last two columns, I just took those values, divided them, and appended that as another element in the list that is saved by writerow()
:
#!/usr/bin/env python
import csv
import datetime
import copy
from collections import defaultdict
with open(r"testin.csv") as i, open(r"TestSingleParaSRResuls.csv", "wb") as o:
rdr = csv.reader(i)
wrt = csv.writer(o)
data, currdate = defaultdict(lambda:[0, 0, 0, 0]), None
for line in rdr:
date, name = datetime.datetime.strptime(line[0], '%d/%m/%Y'), line[7]
if date != currdate or not currdate:
for v in data.itervalues():
#print v[:2]
#print v[2:]
#print "\n"
v[:2] = v[2:]
currdate = date
top,bottom = data[name][0:2]
try:
quotient = float(top)/bottom
except ZeroDivisionError:
quotient = 0
wrt.writerow(line + data[name][:2]+ [quotient])
data[name][3] += 1
if line[6] == "1": data[name][2] += 1
Upvotes: 6