当满足另一列的条件时,如何使用 pandas diff() 函数重置计数?
How do I reset the count using the pandas diff() function when a condition from another column is satisfied?
我正在尝试计算日期之间的天数(累计),(按表示为 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 的日期之间的天数,并在没有我需要的重置的情况下填充缺失值。
关于如何解决这个问题有什么想法吗??
我认为根据重置日期创建一个额外的分组列可能正是您所需要的。
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
我正在尝试计算日期之间的天数(累计),(按表示为 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 的日期之间的天数,并在没有我需要的重置的情况下填充缺失值。
关于如何解决这个问题有什么想法吗??
我认为根据重置日期创建一个额外的分组列可能正是您所需要的。
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