[英]Pandas groupby cumulative sum start from 0
我有以下 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
我想添加最后一列作為未出現約會的累計總和(每個人之前未出現的總和)。 對於名為 (previous-missed-appointments) 的新列中的每個人,它應該從 0 開始。
以下是更容易重現的數據:
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'],
)
我嘗試了df.groupby
和df.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'])
我認為您可以使用的兩種主要方法是groupby
和cumsum
看看下面的代碼:
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.