2016-09-29 3 views
1

У меня есть кадр панда данных:питона панды GroupBy сортировочных и конкатенация

df = pd.DataFrame({'a': [1,1,1,1,2,2,2], 'b': ['a','a','a','a','b','b','b'], 'c': ['o','o','o','o','p','p','p'], 'd': [ [2,3,4], [1,3,3,4], [3,3,1,2], [4,1,2], [8,2,1], [0,9,1,2,3], [4,3,1] ], 'e': [13,12,5,10,3,2,5] }) 

Что я хочу:

Первая группа по столбцам а, Ь, с --- есть две группы

Затем сортировать в пределах каждой группы в соответствии с колонкой е в порядке возрастания

Наконец конкатенации внутри каждой группы столбцов д

Так что результат я хочу:

result = pd.DataFrame({'a':[1,2], 'b':['a','b'], 'c':['o','p'], 'd':[[3,3,1,2,4,1,2,1,3,3,4,2,3,4],[0,9,1,2,3,8,2,1,4,3,1]]}) 

Может кто-нибудь поделиться некоторые быстрые/элегантные способы, чтобы обойти это? Огромное спасибо.

ответ

1

можно сортировать по столбцам e, групповых a, b и c, а затем использовать список понимание конкатенировать d колонки (расплющить его). Обратите внимание на то, что мы можем использовать sort, а затем groupby так GroupBy будет

сохраняют порядок, в котором наблюдения сортируются в рамках каждой группы:

по doc here:

(df.sort_values('e').groupby(['a', 'b', 'c'])['d'] 
        .apply(lambda g: [j for i in g for j in i]).reset_index()) 

enter image description here

Альтернативой пониманию списка является цепь м itertools:

from itertools import chain 
(df.sort_values('e').groupby(['a', 'b', 'c'])['d'] 
        .apply(lambda g: list(chain.from_iterable(g))).reset_index()) 
Смежные вопросы