所以,我有一个我认为很难解决的问题,我有一个脚本可以循环通过 CSV 来计算不同列中数据的出现次数。该脚本运行良好,包含在下面以供参考:
原始脚本
import csv
import datetime
import copy
from collections import defaultdict
with open(r"C:\Temp\test2.csv") as i, open(r"C:\Temp\results2.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 = datetime.datetime.strptime(line[0], '%d/%m/%Y')
name = (line[7], line[9])
if date != currdate or not currdate:
for v in data.itervalues(): v[:2] = v[2:]
currdate = date
wrt.writerow(line + data[name][:2])
data[name][3] += 1
if line[6] == "1": data[name][2] += 1
我已经编辑了这个脚本来添加一个百分比列,我可以让这个脚本手动执行多个不同的列匹配组合,例如,这里的第 7/9 列我可以在一个脚本中将其设置为第 7/10 列等。但是我需要它做什么我不知道所需的功能或方法。本质上,我需要它遍历calclist
此脚本中包含的每个内容,并为 calclists 中列引用的每个组合输出与此脚本关联的数字。即 6/7 6/19 6/23
因为在我的真实脚本中,计算列表比本示例中的要长得多,所以如果此编辑可以包括将标题附加到列的某种方式,我也没有合适的方法或机制来执行此操作。但是,如果有一个 calc 列表的标题列表,那么可能会以这种格式创建一个标题(记住每次脚本运行都有三个标题)"title1-title2-x","title1-title2-y","title1-title2-z"
import csv
import datetime
import copy
from collections import defaultdict
with open(r"dualparametermatch_test.csv") as i, open(r"dualparametermatch_test_edit.csv", "wb") as o:
rdr = csv.reader(i)
wrt = csv.writer(o)
data, currdate = defaultdict(lambda:[0, 0, 0, 0]), None
# Identical calclists
calclist = [6, 7, 19, 23, 25, 26, 35, 62, 64]
calclist2 = [6, 7, 19, 23, 25, 26, 35, 62, 64]
for counter, line in enumerate(rdr):
if counter == 0:
#Titles, there are three for each item in the calclist
titles = ["titleX", "titleY", "titleZ"] # ... etc
wrt.writerow(line + titles)
else:
extra_cols = []
for calc in calclist:
date = datetime.datetime.strptime(line[0], '%d/%m/%Y')
name = (line[calclist], line[calclist2])
if date != currdate or not currdate:
for v in data.itervalues(): v[:2] = v[2:]
currdate = date
### Adds the percentage calulation column
top,bottom = data[name][0:2]
try:
quotient = '{0:0.5f}'.format(float(top)/bottom).rstrip("0")
except ZeroDivisionError:
quotient = 0
extra_cols.extend(data[name][:2]+ [quotient])
data[name][3] += 1
if line[6] == "1": data[name][2] += 1
wrt.writerow(line + data[name][:2])
我很欣赏这可能是一个难以解决的问题,如果有人可以帮助解决这个问题,那么首先向你致敬!如果需要更多详细信息或有任何不清楚的地方,请回复我。如果需要,我可以为原始脚本提供示例数据和输出。在此先感谢 AEA