通过2D数组中的特定行标识符对列进行求和

时间:2014-06-23 21:40:36

标签: python list

我正在尝试创建一个函数,如果每行中的第一项与另一行匹配,则该函数会添加2D数组的最后12列的值。每行的第一个元素代表部门ID号,因此我需要累计每个部门的员工每个月工作的小时数。我的2D数组是一个列表列表,数据样本如下所示:

[[12606.0, 74204.0, 56.0, 64.0, 72.0, 21.6, 18.0, 0.0, 0.0], 
 [12606.0, 105492.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 45.6], 
 [12606.0, 112151.0, 2.4, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
 [12606.0, 121896.0, 0.0, 0.0, 0.0, 0.0, 0.0, 60.8, 0.0]]

我的代码如下:

   def costcentersum(A):
    """Finds the sum of the monthly hours worked by employees in each cost center.
    """
    for i in range(len(A)):
        if A[i-1][0] == A[i][0]:
            A[i][2:] += A[i-1][2:]
    print A[i]

我的输出虽然很奇怪,但不是正确的答案。我明白了:

[12606.0, 121896.0, 0.0, 0.0, 0.0, 0.0, 0.0, 60.8, 0.0, 0.0, 0.0, 8.0, 15.2, 18.4, 2.4, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 45.6, 32.0, 54.4, 52.0, 56.0, 43.2, 56.0, 64.0, 72.0, 21.6, 18.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

我希望我的输出不包含数据的第二列(员工ID)。只需简单的dep ID和每个月的累积小时数。我的代码在哪里出错?谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

该行

A[i][2:] += A[i-1][2:]

将所有列分别添加到上面的行中,添加列表; [1, 2] + [3, 4] == [1, 2, 3, 4]。这就是你的输出看起来那么久的原因。

您的函数实际上并不return有用,只有print是最后一行(只有最后一行,因为printfor循环之外) 。此外,您的代码不会尝试考虑文件中不连续的成本中心。

更好的结构是字典,其中键是成本中心ID,值是第一列是该成本中心的所有行的最后12列的总和。

def cost_center_sum(arr):
    out = {}
    for row in arr:
        cc = int(row[0])
        if cc not in out:
            out[cc] = [0] * 12
        out[cc] = list(map(sum, zip(out[cc], row[2:]))) # add by column
    return out

突出显示的行完成了逐列总结的工作。

示例输入的输出:

{12606: [58.4, 68.0, 72.0, 21.6, 18.0, 60.8, 45.6]}

答案 1 :(得分:1)

您可以使用defaultdict按ID号对所有行进行分组,使用comprehensionzip(*array)对这些行进行分组(这里是Live Ideone Example要播放的列):

<强>的Python:

A = [[12606.0, 74204.0, 56.0, 64.0, 72.0, 21.6, 18.0, 0.0, 0.0], 
     [12606.0, 105492.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 45.6], 
     [12606.0, 112151.0, 2.4, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
     [12606.0, 121896.0, 0.0, 0.0, 0.0, 0.0, 0.0, 60.8, 0.0],
     [12901.0, 74204.0, 25.0, 15.0, 45.0, 38.6, 18.0, 0.0, 0.0],
     [12901.0, 105492.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 45.6]]

from collections import defaultdict
d = defaultdict(list)
for row in A:                 
    d[row[0]].append(row[2:])   # append all rows with same ID number.

print {k:[sum(col) for col in zip(*rows)] for k, rows in d.items()}

<强>输出:

{12606.0: [58.4, 68.0, 72.0, 21.6, 18.0, 60.8, 45.6],
 12901.0: [25.0, 15.0, 45.0, 38.6, 18.0, 0.0, 45.6]}

注意: zip(*rows)用于转置行,以便您可以按列求和。请参阅this SO post

相关问题