简体   繁体   English

按多个元素列表求和

[英]Sum element by multiple element list

I have a list like this. 我有一个这样的清单。

['1', ['A'], '1', '78', '1', 7.8]
['1', ['A'], '2', '87', '1', 34.8]
['1', ['A'], '3', '95', '1', 47.5]
['1', ['A'], '4', '32', '2', 12.8]
['1', ['A'], '5', '65', '2', 39.0]
['1', ['A'], '6', '78', '3', 70.2]
['1', ['A'], '7', '40', '3', 4.0]
['2', ['B'], '1', '78', '1', 7.8]
['2', ['B'], '2', '87', '1', 34.8]

Suppose the element[0] is role number and element[4] is course id. 假设element [0]是角色编号,而element [4]是课程ID。 And last element is grade. 最后一个要素是等级。 I want to group the list by role number and course id while summing the grade. 我想在汇总成绩时按角色编号和课程ID对列表进行分组。

Output should be like 输出应该像

['1', ['A'], '1', '78', '1', 90.1]
['1', ['A'], '4', '32', '2', 51.8]
['1', ['A'], '6', '78', '3', 74.2]
['2', ['B'], '1', '78', '1', 42.6]
import itertools

gkey = lambda x: (x[0] + x[4])

rolenumber = [ ['1', 'A', '1', '78', '1', 7.8],
['1', 'A', '2', '87', '1', 34.8],
['1', 'A', '3', '95', '1', 47.5],
['1', 'A', '4', '32', '2', 12.8],
['1', 'A', '5', '65', '2', 39.0],
['1', 'A', '6', '78', '3', 70.2],
['1', 'A', '7', '40', '3', 4.0],
['2', 'B', '1', '78', '1', 7.8],
['2', 'B', '2', '87', '1', 34.8]]

for k, g in itertools.groupby(rolenumber, gkey):
    nl1 = list(g)
    res = list()
    for i in range(len(nl1)):
        nl2 = nl1[i]
        if i == 0:
            res.extend(nl2)
        else:
            res[5] += nl2[5]

    print(res)

Using pandas you can just group by and get the grade, without the other data from the list. 使用熊猫,您可以分组并获得等级,而无需列表中的其他数据。

import pandas as pd
data = [['1', ['A'], '1', '78', '1', 7.8],
['1', ['A'], '2', '87', '1', 34.8],
['1', ['A'], '3', '95', '1', 47.5],
['1', ['A'], '4', '32', '2', 12.8],
['1', ['A'], '5', '65', '2', 39.0],
['1', ['A'], '6', '78', '3', 70.2],
['1', ['A'], '7', '40', '3', 4.0],
['2', ['B'], '1', '78', '1', 7.8],
['2', ['B'], '2', '87', '1', 34.8]]

d = pd.DataFrame(data = data, columns = ["role_number","a","b","c","course_id","grade"])
d.groupby(["course_id", "role_number"]).sum()
d.reset_index()

dic = {}
l = []
for x in data:
    k = "{}-{}".format(x[0],x[4])
    print i, k
    if dic.has_key(k):
        pass
    else:
        dic[k] = 1
        l.append(x)
rest = pd.DataFrame(data = l, columns = ["role_number","a","b","c","course_id","grade"])

final = pd.merge(d,rest, on=["role_number", "course_id"])

Output: 输出:

    role_number course_id   grade_x     a   b   c   grade_y
0   1            1           90.1       [A] 1   78  7.8
1   2            1           42.6       [B] 1   78  7.8
2   1            2           51.8       [A] 4   32  12.8
3   1            3           74.2       [A] 6   78  70.2

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM