进行各种分组

时间:2012-09-30 15:21:29

标签: python

我的数据集是一起工作或单独工作的人员列表。

每个项目都有一行,列中包含所有参与该项目的人员的姓名。如果第2列是一行中的第一个空列,则它是一个独立作业。如果第4列是连续的第一个空列,则有3个人一起工作。

我有代码可以找到所有对。在输出数据集中,创建方形N x N,每个actor标记列和行。单元格(A,B)和(B,A)包含该对一起工作的次数。使用B的处理与使用A的B处理相同。

输入数据的示例,以逗号分隔的方式:

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个组。此外,如果变量应按字母顺序排列,这将是最简单的。

1 个答案:

答案 0 :(得分:1)

1)按月和按比例对项目进行排序年,然后为每个月创建一个新的“网格”。 e.g:

拉月和&从每一行开始。删除月份和从该行开始,然后将剩余数据添加到字典中。最后你得到类似{()的东西:[,... ]}。从那里,可以轻松遍历每个月/每年并创建网格,输出电子表格等。

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)