简体   繁体   English

Pandas groupby累计和从0开始

[英]Pandas groupby cumulative sum start from 0

I have the following pandas DataFrame (without the last column):我有以下 pandas DataFrame(没有最后一列):

   name        day   show-in-appointment     previous-missed-appointments
0  Jack   2020/01/01   show                              0
1  Jack   2020/01/02   no-show                           0
2  Jill   2020/01/02   no-show                           0 
3  Jack   2020/01/03   show                              1
4  Jill   2020/01/03   show                              1
5  Jill   2020/01/04   no-show                           1
6  Jack   2020/01/04   show                              1
7  Jill   2020/01/05   show                              2
8  jack   2020/01/06   no-show                           1
9  jack   2020/01/07   show                              2

I want to add the last column as the cumulative sum of no-show appointments (sum of previous no-shows for each person).我想添加最后一列作为未出现约会的累计总和(每个人之前未出现的总和)。 for each person in the new column that is called (previous-missed-appointments), it should start from 0.对于名为 (previous-missed-appointments) 的新列中的每个人,它应该从 0 开始。

Here is the data for easier reproducibility:以下是更容易重现的数据:


df = pd.DataFrame(
    data=np.asarray([
        ['Jack', 'Jack', 'Jill', 'Jack', 'Jill', 'Jill', 'Jack', 'Jill', 'jack', 'jack'],
        [
            '2020/01/01',
            '2020/01/02',
            '2020/01/02',
            '2020/01/03',
            '2020/01/03',
            '2020/01/04',
            '2020/01/04',
            '2020/01/05',
            '2020/01/06',
            '2020/01/07',
        ],
        ['show', 'no-show', 'no-show', 'show', 'show', 'no-show', 'show', 'show', 'no-show', 'show'],
    ]).T,
    columns=['name', 'day', 'show-in-appointment'],
)

I tried various combos of df.groupby and df.agg(lambda x: cumsum(x)) to no avail.我尝试了df.groupbydf.agg(lambda x: cumsum(x))的各种组合但无济于事。

import pandas as pd

df.name = df.name.str.capitalize()
df['order'] = df.index
df.day = pd.to_datetime(df.day)
df['noshow'] = df['show-in-appointment'].map({'show': 0, 'no-show': 1})
df = df.sort_values(by=['name', 'day'])
df['previous-missed-appointments'] = df.groupby('name').noshow.cumsum()
df.loc[df.noshow == 1, 'previous-missed-appointments'] -= 1
df = df.sort_values(by='order')
df = df.drop(columns=['noshow', 'order'])

I think the two main methods you can use are groupby and cumsum我认为您可以使用的两种主要方法是groupbycumsum

Have a look at the code below:看看下面的代码:

df.sort_values(by=['name', 'date'], inplace=True, ignore_index=True)
df['check'] = np.where(df['show-in-appointment']=='no-show', 1.0, 0.0)
df['previous-miss'] = df.groupby('name')['check'].cumsum()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM