python / excel:如何为列A中的所有相同值添加列B的值

时间:2016-03-03 02:06:51

标签: python excel sum

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]

谢谢!

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

我改用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