Python 将结果附加到csv中,计算csv中双参数匹配的出现次数
我需要做的是计算以下各项: 一个人出现在列表(第8列)中的次数,该日期早于行中指定的日期,第10列中的t数据相同,第7列中的a 1出现 一个人(第8列)在行中指定日期之前的日期出现在列表中的次数,第10列中具有相同的t数据(注意,它们按时间顺序排序) 用csv原始数据的例子来演示这一点可能更容易Python 将结果附加到csv中,计算csv中双参数匹配的出现次数,python,csv,python-2.7,append,match,Python,Csv,Python 2.7,Append,Match,我需要做的是计算以下各项: 一个人出现在列表(第8列)中的次数,该日期早于行中指定的日期,第10列中的t数据相同,第7列中的a 1出现 一个人(第8列)在行中指定日期之前的日期出现在列表中的次数,第10列中具有相同的t数据(注意,它们按时间顺序排序) 用csv原始数据的例子来演示这一点可能更容易 02/01/2005,Data,Class xpv,4,11yo+,4,1,George Smith,data,15t 02/01/2005,Data,Class xpv,4,11yo+,4,2,Ted
02/01/2005,Data,Class xpv,4,11yo+,4,1,George Smith,data,15t
02/01/2005,Data,Class xpv,4,11yo+,4,2,Ted James,data,22t
02/01/2005,Data,Class xpv,4,11yo+,4,3,Emma Lilly,data,22t
02/01/2005,Data,Class xpv,4,11yo+,4,5,George Smith,data,25t
02/01/2005,Data,Class tn2,4,10yo+,6,4,Tom Phillips,data,15t
03/01/2005,Data,Class tn2,4,10yo+,6,2,Tom Phillips,data,25t
03/01/2005,Data,Class tn2,4,10yo+,6,5,George Smith,data,22t
03/01/2005,Data,Class tn2,4,10yo+,6,3,Tom Phillips,data,25t
03/01/2005,Data,Class tn2,4,10yo+,6,1,Emma Lilly,data,25t
03/01/2005,Data,Class tn2,4,10yo+,6,6,George Smith,data,15t
04/01/2005,Data,Class tn2,4,10yo+,6,6,Ted James,data,25t
04/01/2005,Data,Class tn2,4,10yo+,6,3,Tom Phillips,data,22t
04/01/2005,Data,Class tn2,4,10yo+,6,2,George Smith,data,22t
04/01/2005,Data,Class tn2,4,10yo+,6,4,George Smith,data,25t
04/01/2005,Data,Class tn2,4,10yo+,6,1,George Smith,data,15t
04/01/2005,Data,Class tn2,4,10yo+,6,5,Tom Phillips,data,25t
05/01/2005,Data,Class 22zn,2,10yo+,5,3,Emma Lilly,data,25t
05/01/2005,Data,Class 22zn,2,10yo+,5,1,Ted James,data,22t
05/01/2005,Data,Class 22zn,2,10yo+,5,2,George Smith,data,22t
05/01/2005,Data,Class 22zn,2,10yo+,5,4,Emma Lilly,data,25t
05/01/2005,Data,Class 22zn,2,10yo+,5,5,Tom Phillips,data,15t
根据所述说明,我需要csv的外观:
02/01/2005,Data,Class xpv,4,11yo+,4,1,George Smith,data,15t,0,0
02/01/2005,Data,Class xpv,4,11yo+,4,2,Ted James,data,22t,0,0
02/01/2005,Data,Class xpv,4,11yo+,4,3,Emma Lilly,data,22t,0,0
02/01/2005,Data,Class xpv,4,11yo+,4,5,George Smith,data,25t,0,0
02/01/2005,Data,Class tn2,4,10yo+,6,4,Tom Phillips,data,15t,0,0
03/01/2005,Data,Class tn2,4,10yo+,6,2,Tom Phillips,data,25t,0,0
03/01/2005,Data,Class tn2,4,10yo+,6,5,George Smith,data,22t,0,0
03/01/2005,Data,Class tn2,4,10yo+,6,3,Tom Phillips,data,25t,0,0
03/01/2005,Data,Class tn2,4,10yo+,6,1,Emma Lilly,data,25t,0,0
03/01/2005,Data,Class tn2,4,10yo+,6,6,George Smith,data,15t,1,1
04/01/2005,Data,Class tn2,4,10yo+,6,6,Ted James,data,25t,0,0
04/01/2005,Data,Class tn2,4,10yo+,6,3,Tom Phillips,data,22t,0,0
04/01/2005,Data,Class tn2,4,10yo+,6,2,George Smith,data,22t,0,1
04/01/2005,Data,Class tn2,4,10yo+,6,4,George Smith,data,25t,0,1
04/01/2005,Data,Class tn2,4,10yo+,6,1,George Smith,data,15t,1,2
04/01/2005,Data,Class tn2,4,10yo+,6,5,Tom Phillips,data,25t,0,2
05/01/2005,Data,Class 22zn,2,10yo+,5,3,Emma Lilly,data,25t,1,1
05/01/2005,Data,Class 22zn,2,10yo+,5,1,Ted James,data,22t,0,1
05/01/2005,Data,Class 22zn,2,10yo+,5,2,George Smith,data,22t,0,2
05/01/2005,Data,Class 22zn,2,10yo+,5,4,Emma Lilly,data,25t,1,1
05/01/2005,Data,Class 22zn,2,10yo+,5,5,Tom Phillips,data,15t,0,1
因此,您可以看到,在最后一行,Tom Phillips和15t在这一行(第10列)的前几天发生了1次,在这1次出现中,第7列为“1”的出现次数为零
我的csv数据显然比这大得多,因此高效的技术和建议也将受到赞赏。如果需要更多的澄清,请这样说,很难说这个例子是否可以理解
AEA的种类非常微小的变化:
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 is a dictionary where we will save current and previous data like:
# {
# (George Smith, 15t): [
# previous date count when column 7 = 1,
# previous date count,
# current date count when column 7 = 1,
# current date count
# ]
data, currdate = defaultdict(lambda:[0, 0, 0, 0]), None
for line in rdr:
date = datetime.datetime.strptime(line[0], '%d/%m/%Y')
# key of dictionary would be tuple looking like
# (George Smith, 15t)
name = (line[7], line[9])
# if date is changed, we have to put current values into previous
# by copying part of the list
#
# (George Smith, 15t): [
# previous date count when column 7 = 1,
# previous date count,
# current date count when column 7 = 1,
# current date count
# ]
#
# becomes
#
# (George Smith, 15t): [
# current date count when column 7 = 1,
# current date count
# current date count when column 7 = 1,
# current date count
# ]
# and then we change currdate variable to current one
if date != currdate or not currdate:
for v in data.itervalues(): v[:2] = v[2:]
currdate = date
# writing current line + first 2 elements from list (previous counts)
wrt.writerow(line + data[name][:2])
# updating current counts
data[name][3] += 1
if line[6] == "1": data[name][2] += 1
非常小的变化:
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 is a dictionary where we will save current and previous data like:
# {
# (George Smith, 15t): [
# previous date count when column 7 = 1,
# previous date count,
# current date count when column 7 = 1,
# current date count
# ]
data, currdate = defaultdict(lambda:[0, 0, 0, 0]), None
for line in rdr:
date = datetime.datetime.strptime(line[0], '%d/%m/%Y')
# key of dictionary would be tuple looking like
# (George Smith, 15t)
name = (line[7], line[9])
# if date is changed, we have to put current values into previous
# by copying part of the list
#
# (George Smith, 15t): [
# previous date count when column 7 = 1,
# previous date count,
# current date count when column 7 = 1,
# current date count
# ]
#
# becomes
#
# (George Smith, 15t): [
# current date count when column 7 = 1,
# current date count
# current date count when column 7 = 1,
# current date count
# ]
# and then we change currdate variable to current one
if date != currdate or not currdate:
for v in data.itervalues(): v[:2] = v[2:]
currdate = date
# writing current line + first 2 elements from list (previous counts)
wrt.writerow(line + data[name][:2])
# updating current counts
data[name][3] += 1
if line[6] == "1": data[name][2] += 1
你试过使用这个模块吗?我厌倦了直接编辑这个单参数版本的代码,但是没有用:你试过使用这个模块吗?我厌倦了直接编辑这个单参数版本的代码,但是没有用:希望是,现在,我希望对您的更改进行反向工程,以解决如何进行三方匹配:)(我真的希望我不必发布该匹配!)您可以使用任意长度的元组作为字典的键,因此我认为这对您来说很容易。再次感谢,这是我的分析协议,我可以想象我自己使用这两段代码200+次Hey Roman,没有任何机会让你对上面的答案发表评论,是吗?我知道它厚颜无耻,但它会帮上很大的忙。嗨,没问题!你想让我解释确切的部分吗?希望是这样,现在我希望对你的更改进行反向工程,以解决如何进行三方匹配:)(我真的希望我不必发布该匹配!)你可以使用任意长度的元组作为字典的键,所以我想这对你来说很容易再次感谢,这是我的分析协议,我可以想象我自己使用这两段代码200多次嘿,罗曼,没有任何机会让你对上面的答案发表评论,是吗?我知道它厚颜无耻,但它会帮上很大的忙。嗨,没问题!你想让我解释一下确切的部分吗?