按python DataFrameGroupBy分组,并对阈值前后的部分列变量求和

2024-09-29 21:35:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有3列,一列是分类值,一列是数字,另一列是和否,如下所示:

Column1 Column2 Column3
A       2       yes
A       1       yes
A       3       no
A       2       yes
A       5       yes
B       3       yes
B       1       no
B       2       yes
B       5       yes

我想创建一个新列来求column2值之和,直到column3等于no。然后继续重新启动以求column2元素之和,直到看到group by column1出现任何“no”为止。我想要:

Column1 Column2 Column3 Column4
A       2       yes     3       ( sum of column2 elements until no for group A)
A       1       yes     3
A       3       no      no
A       2       yes     7
A       5       yes     7
B       3       yes     3
B       1       no      no
B       2       yes     7
B       5       yes     7

如何为python数据帧创建此新列

非常感谢您的时间安排


Tags: no元素bygroup分类数字yessum
1条回答
网友
1楼 · 发布于 2024-09-29 21:35:28

首先通过Column1no中的^{}找到组中连续的yes。然后按此新分组的组对Column2求和,并对带有yes的行对Column1求和

s = df.Column3.groupby(df.Column1).apply(lambda x: x.eq('no').cumsum())
df['Column4'] = df[df.Column3 == 'yes'].groupby(['Column1', s])['Column2'].transform('sum')
df.fillna('no')

结果

  Column1  Column2 Column3 Column4
0       A        2     yes       3
1       A        1     yes       3
2       A        3      no      no
3       A        2     yes       7
4       A        5     yes       7
5       B        3     yes       3
6       B        1      no      no
7       B        2     yes       7
8       B        5     yes       7

为了更好地了解这是如何工作的:这些是在s中创建的组

df[['Column3','Column1']].assign(newGroups = s)

输出

  Column3 Column1  newGroups
0     yes       A          0
1     yes       A          0
2      no       A          1
3     yes       A          1
4     yes       A          1
5     yes       B          0
6      no       B          1
7     yes       B          1
8     yes       B          1

相关问题 更多 >

    热门问题