请先查看“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]
谢谢!
答案 0 :(得分:1)
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_key
和cum_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