2016-06-17 5 views
-1

Предположим, что у меня есть 2D список,Как объединить две строки в списке 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

Использование 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]] 
+0

@downvoter, не могли бы вы объяснить, почему вы сбиваете? – 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

Если вам интересно. Вот реализация с использованием raw 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()] 
Смежные вопросы