从另一个2D数组创建二维数组(Python)

时间:2014-06-24 16:08:19

标签: python arrays

嗨所以我正在使用这个2D数组,格式化为列表列表(这里是一个未格式化的小样本):

[[10017.0, 93454.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.6, 0.0], [10024.0, 39374.0, 12.8, 28.8, 24.0, 9.829, 28.8, 62.4, 26.4, 30.4, 18.8, 4.0, 20.0, 16.0], [10024.0, 62807.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 38.0, 25.6, 70.4], [10024.0, 81405.0, 11.2, 12.0, 13.6, 7.2, 46.8, 25.6, 22.4, 8.0, 3.2, 12.0, 16.0, 27.2], [10026.0, 2964.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.717, 9.867, 11.683, 0.0, 5.417, 14.316], [10026.0, 29100.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.608, 1.531, 3.136], [10026.0, 39461.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 16.0, 0.0, 2.4, 0.0], [10026.0, 42209.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 16.8, 8.0, 2.4] ...

格式化版本如下所示:

12230.000  116815.000    17.200     8.000    10.000     9.000     6.000    11.600     6.000     
12230.000  132820.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     
12366.000  93769.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     
12366.000  93961.000     6.400    20.000     0.000     0.000    12.000     4.000    16.000     
12369.000  40256.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     
12369.000  48122.000    37.600    43.200    48.000    45.600    52.000    53.600    40.000    
12379.000  22775.000     0.000     0.000     0.000     0.000     0.000     0.000    37.983

(为了格式化目的,删除了一些列)。 该数组在第一列显示部门ID,在第二列显示员工ID,每个月显示12列,表示每个员工工作的小时数。

我需要设计一个查看每个员工行的函数,并计算每个部门中所有员工的累计工时。在示例数据的情况下,我将有一行Dep ID。 12230,12366,12369和12379,然后是每月12列。我希望这个函数也能输出2D数组中的数据,该数组与列表列表的格式相同。我在下面的功能是,它确实找到了每个部门每个月的累计工时。但是,它不显示部门ID,它只将数据打印为单个列表。关于如何修改我的代码的任何输入将不胜感激!

    def cost_center_sum (A):
        dep_list = []
        for row in range(0,len(A)):
            dep_list.append(A[row][0])
        myList = sorted(set(dep_list))
        for i in range(0,len(myList)):
           sum_list = []
           for col in range(2, len(A[0])):
               sum = 0
               for row in range(0, len(A)):
                    if myList[i]==A[row][0]:
                        sum = sum + A[row][col]
                        sum_list.append(sum)
                        print sum_list

2 个答案:

答案 0 :(得分:1)

尝试类似:

NUMBER_OF_MONTHS = 12
def collapse(A):
    dep = dict()
    for row in A:
        if row[0] not in dep:
            dep[row[0]] = [0.0 for x in xrange(NUMBER_OF_MONTHS)]
        for i in xrange(NUMBER_OF_MONTHS):
            dep[row[0]][i] += row[i+2]
    ret = list()
    for department in dep:
        x = [department]
        x.extend(dep[department])
        ret.append(x)
    return ret

使用测试数据运行它,输出为:

[10024.0, 24.0, 40.8, 37.6, 17.029, 75.6, 88.0, 48.8, 38.4, 22.0, 54.0, 61.6, 113.60000000000001]
[10017.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.6, 0.0]
[10026.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.717, 9.867, 27.683, 18.408, 17.348, 19.852]]

答案 1 :(得分:0)

hours = [sum(data_row[2:]) for data_row in data]

抱歉,我第一次误解了,如果你想按第1列聚合,请获取这样的唯一值:

dep_ids = set(row[0] for row in data)

接下来用每个id初始化字典:

agg_data = dict(id: [0] * 12 for id in dep_ids)

现在您可以按ID运行数据并汇总:

from operator import add
for row in data:
    key = row[0]
    agg_data[key] = map(add, agg_data[key], row[2:])