【问题标题】:python/excel: How do I add values of column B for all the same values in column Apython/excel:如何为 A 列中的所有相同值添加 B 列的值
【发布时间】:2016-03-03 12:29:55
【问题描述】:

Excel Image 1

Excel Image 2

请看“Excel Image 1”开始。

我正在使用 python 来提取前两列,并将它们存储在自己单独的数组中。如果列中的值相同,我想要做的是添加列 B 的值。例如:如果 A 列的值为“0”,则将 -200 和 400 相加得到 200,因为“0”在 A 列的第 1 行和第 2 行。

添加后如“Excel Image 2”所示,将两个 Column 的新值存储在各自单独的数组中,以便我可以将它们用于以后的计算。

import xlrd
excel = '/Users/Bob/Desktop/'

wb1 = xlrd.open_workbook(excel + 'assignment.xlsx')
sh1 = wb1.sheet_by_index(0)

colA,colB = [],[]
for a in range(0,sh1.nrows):
    colA.append(int(sh1.cell(a,0).value))
    colB.append(int(sh1.cell(a,1).value))
print(colA)
print(colB)

for i in colA:
    if i == 0:
        add = colB[0] + colB[1]
print(add)

我想要一个将这些值添加到 B 列中的代码,而不管 A 列中给出了多少个或多少个相同的值。

当前输出:

[0, 0, 1, 2, 2, 2, 3, 3, 4, 4]
[-200, 400, 30, 600, -70, 10, 20, -90, 40, 40]

预期输出:

[0, 1, 2, 3, 4]
[200, 30, 540, 70, 80]

谢谢!

【问题讨论】:

    标签: python excel sum


    【解决方案1】:

    使用itertools.groupby():

    from itertools import groupby
    import xlrd
    excel = '/Users/Bob/Desktop/'
    
    wb1 = xlrd.open_workbook(excel + 'assignment.xlsx')
    sh1 = wb1.sheet_by_index(0)
    
    sheet_rows = [sh1.row(r) for r in range(0, sh1.nrows)]
    groups = groupby(sheet_rows, lambda row: row[1])
    
    key_list = []
    sum_list = []
    for key, group in groups:
        key_list.append(key)
        sum_list.append(sum(group))
    
    print(key_list)
    print(sum_list)
    

    【讨论】:

    【解决方案2】:

    我会改用 row_values 方法。这通过行号和列号(从零开始)调用。例如,要获取列表中的第一行,请执行以下操作:

    first_row = sh1.row_values(0)
    [0.0, -200.0]
    

    对列表进行切片以从特定列中获取值。如:

    sh1.row_values(0)[1]
    -200.0
    

    我首先跟踪第一列 (curr_key) 中的值,并对给定键 —cum_sum 运行累积和。当密钥更改时,我只需更新将cum_sum 附加到sum_list 并更新curr_keycum_sum。最后要做的是将最后一个值附加到累积和中。

    curr_key = sh1.row_values(0)[0]
    cum_sum = sh1.row_values(0)[1]
    sum_list = []
    for a in range(1,sh1.nrows):
        if sh1.row_values(a)[0] == curr_key:
            cum_sum += sh1.row_values(a)[1]
            curr_key = sh1.row_values(a)[0]
        else:
            sum_list.append(cum_sum)
            curr_key = sh1.row_values(a)[0]
            cum_sum = sh1.row_values(a)[1]
    sum_list.append(cum_sum)
    

    这会在sum_list 中产生以下内容:

    [200.0, 30.0, 540.0, -70.0, 80.0]
    

    顺便说一句,您的第二个文件在第 3 行有 70.0 而不是 -70.0。

    经过一番思考,我意识到更好的方法是使用字典(在概念上类似于 @Austin Hastings 的答案,但没有 groupby)。

    key_vals = [x for x in sh1.col_values(0)]
    int_vals = [y for y in sh1.col_values(1)]
    sum_list = {}
    for i,value in enumerate(key_vals):
        if str(value) not in sum_list:
            sum_list[str(value)] = int_vals[i]
        else:
            sum_list[str(value)] += int_vals[i]
    for key in sorted(sum_list):
        print('{}, {}'.format(key, sum_list[key]))
    

    这会产生:

    0.0, 200.0
    1.0, 30.0
    2.0, 540.0
    3.0, -70.0
    4.0, 80.0
    

    【讨论】:

    • 那么 [0,1,2,3,4] 呢?如何打印?
    • 您可以通过在更改“if”的else 部分中的键之前附加值来跟踪另一个列表中的curr_key 值。
    • 能否将其添加到代码中。我很困惑。
    • ....您能帮我解决以下链接中的问题吗:stackoverflow.com/questions/35763589/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 2020-12-20
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    相关资源
    最近更新 更多