假设我有一个2D列表,
a= [['a','b','c',1],
['a','b','d',2],
['a','e','d',3],
['a','e','c',4]]
我想获得一个列表,如果行中的前两个元素相同,则将第四个元素相加,删除第三个元素并将这些行组合在一起,如下所示,
b = [['a','b',3],
['a','e',7]]
最有效的方法是什么?
答案 0 :(得分:2)
如果您的列表已经排序,则可以使用itertools.groupby
。按前两个元素分组后,可以使用生成器表达式对第4个元素求和并创建新列表。
>>> from itertools import groupby
>>> a= [['a','b','c',1],
['a','b','d',2],
['a','e','d',3],
['a','e','c',4]]
>>> [g[0] + [sum(i[3] for i in g[1])] for g in groupby(a, key = lambda i : i[:2])]
[['a', 'b', 3],
['a', 'e', 7]]
答案 1 :(得分:1)
使用pandas
' s groupby
:
import pandas as pd
df = pd.DataFrame(a)
df.groupby([0, 1]).sum().reset_index().values.tolist()
输出:
df.groupby([0, 1]).sum().reset_index().values.tolist()
Out[19]: [['a', 'b', 3L], ['a', 'e', 7L]]
答案 2 :(得分:0)
您可以使用pandas groupby方法来实现这一目标。
import pandas as pd
a= [['a','b','c',1],
['a','b','d',2],
['a','e','d',3],
['a','e','c',4]]
df = pd.DataFrame(a)
df_sum = df.groupby([0,1])[3].sum().reset_index()
array_return = df_sum.values
list_return = array_return.tolist()
print(list_return)
list_reuturn是你想要的结果。
答案 3 :(得分:0)
如果你有兴趣。这是一个使用原始python的实现。我只在您提供的数据集上测试过它。
a= [['a','b','c',1],
['a','b','d',2],
['a','e','d',3],
['a','e','c',4]]
b_dict = {}
for row in a:
key = (row[0], row[1])
b_dict[key] = b_dict[key] + row[3] if key in b_dict else row[3]
b = [[key[0], key[1], value] for key, value in b_dict.iteritems()]