GroupBy 但仍保留所有行

Aja*_*nni 5 group-by python-3.x pandas

我有这个数据框

data = [[1,'A','a'],
        [1,'A','b'],
        [1,'B','a'],
        [2,'A','a'],
        [2,'A','b'],
        [2,'A','c']]

df_1 = pd.DataFrame(data = data,columns = ['id','Main','sub_steps'])
Run Code Online (Sandbox Code Playgroud)

输出

   id Main Sub_steps
0   1    A         a
1   1    A         b
2   1    B         a
3   2    A         a
4   2    A         b
5   2    A         c
Run Code Online (Sandbox Code Playgroud)

我想 groupby (id, Main) 并仍然保留所有行

所需输出

   id Main Sub_steps      lst
0   1    A         a    [a,b]
1   1    A         b    [a,b]
2   1    B         a      [a]
3   2    A         a  [a,b,c]
4   2    A         b  [a,b,c]
5   2    A         c  [a,b,c]
Run Code Online (Sandbox Code Playgroud)

如果我只是用 id 和 main 进行分组并压平另一行

df_1.groupby(['id','Main']).agg({'Sub_steps':list})
Run Code Online (Sandbox Code Playgroud)

我会得到这个

         Sub_steps
id Main           
1  A        [a, b]
   B           [a]
2  A     [a, b, c]
Run Code Online (Sandbox Code Playgroud)

Sco*_*ton 3

在列名上使用并重命名withmerge返回的 pd.Series :groupbyagg

df_1.merge(df_1.groupby(['id','Main'])['sub_steps'].agg(list).rename('lst'),
           on=['id', 'Main']))
Run Code Online (Sandbox Code Playgroud)

输出:

   id Main sub_steps        lst
0   1    A         a     [a, b]
1   1    A         b     [a, b]
2   1    B         a        [a]
3   2    A         a  [a, b, c]
4   2    A         b  [a, b, c]
5   2    A         c  [a, b, c]
Run Code Online (Sandbox Code Playgroud)

您可以将聚合的输出合并回原始数据帧。