Groupby&从一个特定值的出现到另一个特定值或相同值的出现的总和

2024-10-01 15:32:42 发布

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

我有一个数据帧如下。 我想groupby“用户”&;'夏娃和sumSes'直到100/200&;从100到200。 另外,返回出现100/200的“Name”列的值

如果在100之后,则没有100或200(如a组的最后一行;123或a&;456),忽略它

User    eve Ses ID  Name
a   123 1   10  a
a   123 2   11  a
a   123 3   12  a
a   123 4   13  a
a   123 3   100 xyz
a   123 6   10  a
a   456 1   11  a
a   456 2   12  a
a   456 3   13  a
a   456 4   40  a
a   456 1   100 mno
a   456 14  10  a
a   456 7   20  a
a   456 8   30  a
a   456 12  200 pqr
a   456 10  10  a
b   123 1   20  a
b   123 2   30  a
b   123 3   40  a
b   123 4   50  a
b   123 1   70  a
b   123 6   100 abc
b   888 1   20  a
b   888 1   200 jkl
b   888 3   10  a
b   888 4   20  a
b   888 5   30  a
b   888 1   100 rrr
b   888 7   50  a
b   888 8   70  a

上述输入df的预期输出为以下df

User    eve Ses Name
a   123 13  xyz
a   456 11  mno
a   456 41  pqr
b   123 17  abc
b   888 2   jkl
b   888 13  rrr

Tags: 数据用户namedfjkleveampses
1条回答
网友
1楼 · 发布于 2024-10-01 15:32:42

这是我的方法:

# valid IDs
df['valids'] = df['ID'].isin([100,200])

# mask the trailing non-hundred ids
heads = (df['ID'].where(df['valids'])
             .groupby([df['User'],df['eve']])
             .bfill().notnull()
        )
df = df[heads]

# groupby and output:
(df.groupby(['User','eve', df['valids'].shift(fill_value=0).cumsum()],
           as_index=False)
   .agg({'Ses':'sum', 'Name':'last'})
)

输出:

  User  eve  Ses Name
0    a  123   13  xyz
1    a  456   11  mno
2    a  456   41  pqr
3    b  123   17  abc
4    b  888    2  jkl
5    b  888   13  rrr

相关问题 更多 >

    热门问题