python pandas groupby排序和连接

时间:2016-09-29 01:40:29

标签: python pandas dataframe group-by

我有一个熊猫数据框:

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

我想要的是:

第一组按列a,b,c ---有两组

然后根据列e按升序对每个组进行排序

最后在每个组列中连接d

所以我想要的结果是:

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 个答案:

答案 0 :(得分:2)

您可以按列e排序,按abc分组,然后使用列表推导来连接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

list-comprehension的替代方法是来自itertools的链:

from itertools import chain
(df.sort_values('e').groupby(['a', 'b', 'c'])['d']
                    .apply(lambda g: list(chain.from_iterable(g))).reset_index())