2012-09-30 36 views
0

我的数据集是一个或者一起工作或者单独工作的人员列表。制作各种分组

我对每个项目都有一行,并且列出了所有在该项目上工作的人员的姓名。如果第2列是连续第一个空列,那么这是一个独奏作业。如果第4列是连续第一个空列,则有3个人一起工作。

我有代码找到所有对。在输出数据集中,每个角色标注行和列都会创建一个正方形N x N。单元格(A,B)和(B,A)包含该对单元一起工作的次数。与B A工作被视为与B相同与A.

输入数据的一个例子的工作,在一个逗号分隔的方式:

A,.,. 
A,B,. 
B,C,E 
B,F,. 
D,F,. 
A,B,C 
D,B,. 
E,C,B 
X,D,A 
F,D,. 
B,.,. 
F,.,. 
F,X,C 
C,F,D 

我使用Python 3.2。执行此代码:

import csv 
import collections 
import itertools 

grid = collections.Counter() 

with open("connect.csv", "r") as fp: 
    reader = csv.reader(fp) 
    for line in reader: 
     # clean empty names 
     line = [name.strip() for name in line if name.strip()] 
     # count single works 
     if len(line) == 1: 
      grid[line[0], line[0]] += 1 
     # do pairwise counts 
     for pair in itertools.combinations(line, 2): 
      grid[pair] += 1 
      grid[pair[::-1]] += 1 

actors = sorted(set(pair[0] for pair in grid)) 

with open("connection_grid.csv", "w") as fp: 
    writer = csv.writer(fp) 
    writer.writerow([''] + actors) 
    for actor in actors: 
     line = [actor,] + [grid[actor, other] for other in actors] 
     writer.writerow(line) 

我的问题是:

  1. 如果我有几个月甚至几年一列,是有可能使每个月一年矩阵表格? (即2011年,我会有12个矩阵)?

  2. 对于我使用的任何故障,是否可以创建一个变量,以便变量名是所有一起工作的人的组合?例如'ABD'意味着一个项目A人,B人和D人一起工作,并且等于ABD按照任意顺序作为一个三人小组工作的次数。项目最多可容纳20人,因此它必须能够组成2到20个小组。另外,如果变量应按字母顺序排列,这将是最容易的。

+0

快速推荐/请求。请返回并更正“打开”代码块中的缩进。如您所知,缩进在Python中很重要。没有他们,读者就会猜测你在做什么。 –

回答

1

1)按月&年排序您的项目,然后创建每个月都有新的“网格”。例如:

从每一行拉年。从行中删除月份&年,然后将其余数据添加到字典中。最后你得到类似于{(,):[线,线,...]}。从那里,很容易循环每个月/每年,并创建一个网格,输出电子表格等。

2)''.join(sorted(list)).replace('.','')给你一起工作的人按字母顺序列出。

import csv 
import collections 
import itertools 

grids = dict() 
groups = dict() 

with open("connect.csv", "r") as fp: 
    reader = csv.reader(fp) 
    for line in reader: 
     # extract month/year from the last column 
     date = line.pop(-1) 
     month,year = date.split('/') 
     # clean empty names 
     line = [name.strip() for name in line if name.strip()] 
     # generate group name 
     group = ''.join(sorted(line)).replace('.','') 
     #increment group count 
     if group in groups: 
      groups[group]+=1 
     else: 
      groups[group]=1 
     #if grid exists for month, update else create 
     if (month,year) in grids: 
      grid = grids[(month,year)] 
     else: 
      grid = collections.Counter() 
      grids[(month,year)] = grid 
     # count single works 
     if len(line) == 1: 
      grid[line[0], line[0]] += 1 
     # do pairwise counts 
     for pair in itertools.combinations(line, 2): 
      grid[pair] += 1 
      grid[pair[::-1]] += 1 

for date,grid in grids.items(): 
    actors = sorted(set(pair[0] for pair in grid)) 
    #Filename from date 
    filename = "connection_grid_%s_%s.csv" % date 
    with open(filename, "w") as fp: 
     writer = csv.writer(fp) 
     writer.writerow([''] + actors) 
     for actor in actors: 
      line = [actor,] + [grid[actor, other] for other in actors] 
      writer.writerow(line) 

with open('groups.csv','w') as fp: 
    writer = csv.writer(fp) 
    for item in sorted(groups.items()): 
     writer.writerow(item) 
+0

这太好了,我有几天,所以我添加到您的代码'月,日,年'..可以添加,如果你喜欢。一个问题是,我在我的行和列之间得到空格,无法摆脱它们。通过变量,我应该已经更清楚了,我想要一个电子表格,列出所有的分组(按照字母顺序),并且旁边的列将会显示该分组在数据中发生了多少次。因此,对于每个分组给出的数据是唯一的,保存一个,所以我会(用一个,分割输出列)A,1; AB,1; BCE,2(因为BCE和ECB相当); BF,1; etc – FJ17

+0

另外,我怎样才能标记文件名称与年份然后一个月,因为我有多年的数据 – FJ17

+0

好吧,我编辑代码打印出组到csv也。 它已经按月份生成文件名了。反之亦然,请将上面的代码切换为(年,月)而不是(月,年),月份除外,year = date.split('/') 我不确定为什么要在你的行和列,需要查看输入文件。 我希望你使用SO来学习,不要让自定义脚本完成!上面的脚本完成了你所需要的大部分工作,你应该自己尝试一下,让它按照你的要求工作。提示:为了消除额外的空间,我们使用.strip() –