重塑表格以创build按前缀聚合的时间序列

我有一个类似于以下的表格:

name,time_in,time_out jim,1/1/2000 08:24,1/1/2000 15:24 jim,1/2/2000 08:13,1/2/2000 16:24 jim,1/3/2000 08:14,1/3/2000 15:25 jim,1/4/2000 08:33,1/4/2000 16:23 linda,1/1/2000 08:24,1/1/2000 15:24 mark,1/2/2000 08:13,1/2/2000 16:24 mark,1/3/2000 08:14,1/3/2000 15:25 mark,1/4/2000 08:33,1/4/2000 16:23 

忽略实际时间,点是天不排队。 我所看到的大部分重新塑造的东西都有很好的和正方形的地方,我的数据可能最终被稀疏地重新塑造。 有没有一种简单的方法(寻找R解决scheme,但打开Excel或任何快速)来创build一个类似于以下内容的表聚合:

 jim,1/1/2000 08:24,1/1/2000 15:24,1/2/2000 08:13,1/2/2000 16:24,1/3/2000 08:14,1/3/2000 15:25,1/4/2000 08:33,1/4/2000 16:23 linda,1/1/2000 08:24,1/1/2000 15:24 mark,1/2/2000 08:13,1/2/2000 16:24,1/3/2000 08:14,1/3/2000 15:25,1/4/2000 08:33,1/4/2000 16:23 

每个人聚集到一行(不知道如何处理标题,请打开提示)。

考虑这个基本的R解决scheme,它使用不同名称上的运行计数,并将重新计数用long来宽到count:

 # RECREATING DATA FRAME df <- data.frame(name = c("Jim", "Jim", "Jim", "Jim", "linda", "mark", "mark", "mark"), time_in = c("1/1/2000 8:24", "1/2/2000 08:13", "1/3/2000 08:14", "1/4/2000 08:33", "1/1/2000 08:24", "1/2/2000 08:13", "1/3/2000 08:14", "1/4/2000 08:33"), time_out = c("1/1/2000 15:24", "1/2/2000 16:24", "1/3/2000 15:25", "1/4/2000 16:23", "1/1/2000 15:24", "1/2/2000 16:24", "1/4/2000 15:25", "1/4/2000 16:23")) # COUNTING BY GROUPED NAMES df$numcount <- sapply(1:nrow(df), function(i) sum(df[1:i, c("name")] == df$name[i])) # RESHAPING LONG TO WIDE reshapedf <- reshape(df, v.names = c("time_in", "time_out"), timevar=c("numcount"), idvar = c("name"), direction = "wide") row.names(reshapedf) <- NULL reshapedf 

OUTPUT

  name time_in.1 time_out.1 time_in.2 time_out.2 time_in.3 time_out.3 time_in.4 time_out.4 1 Jim 1/1/2000 8:24 1/1/2000 15:24 1/2/2000 08:13 1/2/2000 16:24 1/3/2000 08:14 1/3/2000 15:25 1/4/2000 08:33 1/4/2000 16:23 2 linda 1/1/2000 08:24 1/1/2000 15:24 <NA> <NA> <NA> <NA> <NA> <NA> 3 mark 1/2/2000 08:13 1/2/2000 16:24 1/3/2000 08:14 1/4/2000 15:25 1/4/2000 08:33 1/4/2000 16:23 <NA> <NA> 

假设所有要在相同名称下聚合的行都是连续的,这个Python脚本

 from itertools import groupby with open('infile.txt') as in_f, open('outfile.txt', 'w') as out_f: next(in_f) # skip header aggr = groupby(in_f, lambda line: line.partition(',')[0]) for k, lines in aggr: slines = (l.lstrip(k+',').rstrip() for l in lines) out_line = k+','+','.join(slines)+'\n' out_f.write(out_line) 

做的伎俩。

例如,用一个input文件

 name,time_in,time_out jim,1/1/2000 08:24,1/1/2000 15:24 jim,1/2/2000 08:13,1/2/2000 16:24 jim,1/3/2000 08:14,1/3/2000 15:25 jim,1/4/2000 08:33,1/4/2000 16:23 linda,1/1/2000 08:24,1/1/2000 15:24 mark,1/2/2000 08:13,1/2/2000 16:24 mark,1/3/2000 08:14,1/3/2000 15:25 mark,1/4/2000 08:33,1/4/2000 16:23 

它会产生一个输出文件

 jim,1/1/2000 08:24,1/1/2000 15:24,1/2/2000 08:13,1/2/2000 16:24,1/3/2000 08:14,1/3/2000 15:25,1/4/2000 08:33,1/4/2000 16:23 linda,1/1/2000 08:24,1/1/2000 15:24 mark,1/2/2000 08:13,1/2/2000 16:24,1/3/2000 08:14,1/3/2000 15:25,1/4/2000 08:33,1/4/2000 16:23 

它利用了itertools.groupby的强大function

基本上,只要前缀(即名称)不改变,它就保持分组。 当它移动时,在新find的前缀上创build另一个组。 然后,它简单地将每个组的元素连接在一起,用“,”

注意:如果您希望标题出现在输出文件中,请更改该行

  next(in_f) # skip header 

  out_f.write(next(in_f)) # write and skip header