当满足另一列的条件时,如何使用pandas diff()函数重置计数?

2024-04-26 05:21:36 发布

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

我试图计算日期之间的天数(累计)(按id列分组),但是,只要满足条件,我就要重置计数器

下面我有以下数据框:

     reset_day category       date     id  tdelta
0            N      low 2019-09-04  16876     NaN
1            N      low 2019-09-05  16876     NaN
2            N      low 2019-09-06  16876     NaN
3            N      low 2019-09-07  16876     NaN
4            N      low 2019-09-08  16876     NaN
...        ...      ...        ...    ...     ...
5144         Y   medium 2021-05-23  17612     0.0
5145         Y     high 2021-05-23  23406     0.0
5146         Y     high 2021-05-23  21765     0.0
5147         Y   medium 2021-05-23  19480     0.0
5148         Y   medium 2021-05-23   9066     0.0

在这里,我想在“tdelta”列中输入值,其中的值当前为NaN。此列统计每个id的“日期”列之间的天数

但是,我正在努力根据“reset_day”列重置计数。如果列值为“Y”,则该特定id的计数应再次开始。在这种情况下,您可以在tdelta列中看到值0

我之前曾在类似的数据帧上尝试过以下操作,方法是创建另一列,表示为test t delta:

example = example.sort_values(by="date")
example['date'] = pd.to_datetime(example['date'], format='%Y/%m/%d')
example['test tdelta'] = example.groupby('id')['date'].diff() / np.timedelta64(1, 'D')
example['test tdelta'] = example['test tdelta'].fillna(0) 

但是,这只是计算每个id的日期之间的天数,并在不需要重置的情况下填充缺少的值

有没有办法解决这个问题


Tags: 数据testiddateexamplenanlow重置
1条回答
网友
1楼 · 发布于 2024-04-26 05:21:36

我认为,根据重置日期创建一个额外的分组列可能是您想要的

import pandas as pd
import numpy as np

df = pd.DataFrame({'reset_day':['N','N','Y','N','N','Y','Y','Y','Y','Y'],
                   'category':['low','low','low','low','low','medium','high','high','medium','medium'],
                   'date':['2019-09-04','2019-09-05','2019-09-06','2019-09-07','2019-09-08','2021-05-23','2021-05-23','2021-05-23','2021-05-23','2021-05-23'],
                   'id':[16876,16876,16876,16876,16876,17612,23406,21765,19480,9066]
                   })


df['date'] = pd.to_datetime(df['date'], format='%Y/%m/%d')
df = df.sort_values(['id','date'])

#create extra grouping column based on reset day
df['reset_group'] = df['reset_day'].replace({'N':False,'Y':True})
df['reset_group'] = df.groupby('id')['reset_group'].cumsum()

#use extra grouping column when calculating differences
df['tdelta'] = df.groupby(['id','reset_group'])['date'].diff() / np.timedelta64(1, 'D')
df['tdelta'] = df.groupby(['id','reset_group'])['tdelta'].cumsum().fillna(0)
print(df)

  reset_day category       date     id  reset_group  tdelta
9         Y   medium 2021-05-23   9066            1     0.0
0         N      low 2019-09-04  16876            0     0.0
1         N      low 2019-09-05  16876            0     1.0
2         Y      low 2019-09-06  16876            1     0.0
3         N      low 2019-09-07  16876            1     1.0
4         N      low 2019-09-08  16876            1     2.0
5         Y   medium 2021-05-23  17612            1     0.0
8         Y   medium 2021-05-23  19480            1     0.0
7         Y     high 2021-05-23  21765            1     0.0
6         Y     high 2021-05-23  23406            1     0.0

相关问题 更多 >