从一个特定值出现到另一个特定值或相同值出现为止的Groupby&Sum

时间:2019-12-11 08:34:12

标签: python python-3.x pandas dataframe group-by

我有一个如下数据框。 我想groupby'用户'&'夏娃'和sum'Ses'直到100/200,再从100到200。 另外,返回出现“ 100/200”的“名称”列的值。

如果在一百之后没有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

1 个答案:

答案 0 :(得分:3)

这是我的方法:

# 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