Python 3.x 但仍保留所有行

Python 3.x 但仍保留所有行,python-3.x,pandas,group-by,Python 3.x,Pandas,Group By,我有这个数据框 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']) 输出 id Main Sub_steps 0 1 A a

我有这个数据框

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'])
输出

   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
我想分组(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]
如果我用id和main进行分组,然后展平另一行

df_1.groupby(['id','Main']).agg({'Sub_steps':list})
我会得到这个

         Sub_steps
id Main           
1  A        [a, b]
   B           [a]
2  A     [a, b, c]

对列名使用
merge
,重命名
groupby
agg
返回的pd.序列:

df_1.merge(df_1.groupby(['id','Main'])['sub_steps'].agg(list).rename('lst'),
           on=['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]
   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]

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

另一种方法是使用
.transform()

印刷品:

   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]