2016-06-17 228 views
-1

假设我有一个二维表,如何在Python列表两行合并

a= [['a','b','c',1], 
    ['a','b','d',2], 
    ['a','e','d',3], 
    ['a','e','c',4]] 

我想获得一个列表,例如,如果行中的前两个元素是相同的,总结的第四个元素,删除第三个要素和这些行组合在一起,像下面,

b = [['a','b',3], 
    ['a','e',7]] 

什么是最有效的方式做到这一点?

回答

1

使用pandasgroupby

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]] 
+0

@downvoter,你能解释为什么你downvote? – MaThMaX

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]] 
0

可以使用熊猫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是你想要的结果。

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()]