巨蟒 pandas 计算日期之间的平均天数

2022-03-31 00:00:00 python pandas average group-by if-statement

问题描述

使用以下巨蟒 pandas 数据帧df:

Customer_ID | Transaction_ID
ABC            2016-05-06-1234
ABC            2017-06-08-3456
ABC            2017-07-12-5678
ABC            2017-12-20-6789
BCD            2016-08-23-7891
BCD            2016-09-21-2345
BCD            2017-10-23-4567
不幸的是,日期隐藏在Transaction_id字符串中。我是这样编辑数据帧的。

#year of transaction
df['year'] = df['Transaction_ID'].astype(str).str[:4]

#date of transaction
df['date'] = df['Transaction_ID'].astype(str).str[:10]

#format date
df['date']=pd.to_datetime(df['date'], format='%Y-%m-%d')

#calculate visit number per year
df['visit_nr_yr'] = df.groupby(['Customer_ID', 'year']).cumcount()+1

现在df如下所示:

Customer_ID | Transaction_ID    | year  | date        |visit_nr_yr 
ABC            2016-05-06-1234    2016    2016-05-06    1            
ABC            2017-06-08-3456    2017    2017-06-08    1            
ABC            2017-07-12-5678    2017    2017-07-12    2            
ABC            2017-12-20-6789    2017    2017-12-20    3            
BCD            2016-08-23-7891    2016    2016-08-23    1            
BCD            2016-09-21-2345    2016    2016-09-21    2            
BCD            2017-10-23-4567    2017    2017-10-23    1            

我需要计算以下内容:

  • 每次访问的平均间隔天数(即介于第1&2和第2&;3之间)
  • 一般两次访问的平均天数

首先,我想加入以下列"天数_间隔_访问_按年"(按Customer_ID计算):

Customer_ID|Transaction_ID  |year| date       |visit_nr_yr|days_bw_visits_yr 
ABC         2016-05-06-1234  2016  2016-05-06   1             NaN
ABC         2017-06-08-3456  2017  2017-06-08   1             NaN
ABC         2017-07-12-5678  2017  2017-07-12   2             34
ABC         2017-12-20-6789  2017  2017-12-20   3             161
BCD         2016-08-23-7891  2016  2016-08-23   1             NaN
BCD         2016-09-21-2345  2016  2016-09-21   2             29
BCD         2017-10-23-4567  2017  2017-10-23   1             NaN

请注意,我故意避免0,并保留了NAN,以防有人在同一天有两次访问。

接下来,我想按访问计算两次访问之间的平均天数(因此在一年内介于1和2到2和3之间)。正在查找此输出:

avg_days_bw_visits_1_2 | avg_days_bw_visits_2_3
31.5                     161

最后,我想计算一下一般访问之间的平均天数:

output: 203.8 
#the days between visits are 398,34,161,29,397 and the average of those 
 numbers is 203.8

我一直纠结于如何创建专栏"Days_bw_visors_yr"。 Nan必须被排除在数学之外。


解决方案

您可以通过将"Date"列下移1来获取上次访问日期(按客户和年份分组):

df['previous_visit'] = df.groupby(['Customer_ID', 'year'])['date'].shift()

由此,两次访问之间的天数就是简单的差异:

df['days_bw_visits'] = df['date'] - df['previous_visit']

要计算平均值,请将日期增量对象转换为天数:

df['days_bw_visits'] = df['days_bw_visits'].apply(lambda x: x.days)

平均访问间隔天数:

df.groupby('visit_nr_yr')['days_bw_visits'].agg('mean')

df['days_bw_visits'].mean()

相关文章