pandas 带有附加字段计算的Python groupby聚集列表

pn9klfpd  于 2023-01-01  发布在  Python
关注(0)|答案(1)|浏览(98)

我有这样的 Dataframe ,我想按列1和列2分组,并将列4和平均列5的聚集列表添加到列表中,谢谢。

Col1  Col2        Col3    Col4    Col5
0   A     09/09/2021  1       Blue    5
1   A     09/09/2021  2       Blue    2
2   A     09/09/2021  3       Red     1
3   A     09/03/2021  1       Red     1
4   B     09/05/2021  1       Yellow  7
5   B     09/05/2021  2       Red     2
6   B     09/05/2021  3       Yellow  2
7   C     09/01/2021  1       Red     2
8   C     09/01/2021  2       Red     2
9   C     09/03/2021  1       Red     4
10  C     09/03/2021  2       Red     10
11  C     09/03/2021  3       Blue    2

我想看两个 Dataframe
已尝试:df.groupby(['Col1', 'Col2'],as_index=False).agg({'Col4':(lambda x: list(x.unique()))}),但无法连接平均Col5
版本1

Col1  Col2        Col3    Col4         Col5
0   A     09/09/2021  1,2,3   Blue,Red     3.5,1
1   A     09/03/2021  1       Red          1
2   B     09/05/2021  1,2     Yellow,Red   4.5,2
3   C     09/01/2021  1,2     Red          2
4   C     09/03/2021  1,3     Red,Blue     7,2

版本2
因此,从版本1开始,我希望看到聚合列表在每个记录的单独列上,而在版本2中没有Col3,因此

0 A 09/09/2021 1,2,3 Blue,Red 3.5,1

变成

0 A 09/09/2021 Blue, 3.5, Red ,1

并且如果记录具有许多聚集列表

Blue, Red, Yellow, Black 2, 3, 23, 3

则将添加额外的8个字段以变为

Blue, 2, Red, 3, Yellow, 23, Black , 3

版本2的预期输出如下所示

Col1  Col2        Col4     Col5    Col6    Col7
0   A     09/09/2021  Blue     3.5     Red     1
1   A     09/03/2021  Red      1
2   B     09/05/2021  Yellow   4.5     Red     2
3   C     09/01/2021  Red      2       
4   C     09/03/2021  Red      7       Blue    2
yyhrrdl8

yyhrrdl81#

您需要两个groupby

(df.astype({'Col3': str})
   .groupby(['Col1', 'Col2', 'Col4'], sort=False, as_index=False)
   .agg({'Col3': ', '.join, 'Col5': 'mean'})
   .astype(str)
   .groupby(['Col1', 'Col2'], as_index=False).agg(', '.join)
)

输出:

Col1        Col2         Col4     Col3      Col5
0    A  09/03/2021          Red        1       1.0
1    A  09/09/2021    Blue, Red  1, 2, 3  3.5, 1.0
2    B  09/05/2021  Yellow, Red  1, 3, 2  4.5, 2.0
3    C  09/01/2021  Yellow, Red     1, 2  2.0, 2.0
4    C  09/03/2021    Red, Blue  1, 2, 3  7.0, 2.0
版本2:
(df.astype({'Col3': str})
   .groupby(['Col1', 'Col2', 'Col4'], sort=False, as_index=False)
   .agg({'Col3': ', '.join, 'Col5': 'mean'})
   .sort_values(by='Col5', ascending=False)
   .assign(n=lambda d: d.groupby(['Col1', 'Col2']).cumcount())
   .pivot(index=['Col1', 'Col2'], columns='n', values=['Col4', 'Col5'])
   .sort_index(level=1, axis=1)
   .pipe(lambda d: d.set_axis([f'Col{i+4}' for i in range(d.shape[1])], axis=1))
   .reset_index()
)

输出:

Col1        Col2    Col4 Col5  Col6 Col7
0    A  09/03/2021     Red  1.0   NaN  NaN
1    A  09/09/2021    Blue  3.5   Red  1.0
2    B  09/05/2021  Yellow  4.5   Red  2.0
3    C  09/01/2021     Red  2.0   NaN  NaN
4    C  09/03/2021     Red  7.0  Blue  2.0

相关问题