【发布时间】:2017-12-27 17:10:35
【问题描述】:
使用以下 python 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 之间)
- 一般访问之间的平均天数是多少
首先,我想包括以下列“days_between_visits_by year”(由 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 并保留 Nans,以防有人在同一天两次访问。
接下来我想计算访问之间的平均天数(因此在一年内介于 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_visits_yr”列。 Nans必须被排除在数学之外。
【问题讨论】:
-
你能发布你想要的(最终)数据集吗?
-
@MaxU,列 days_bw_visits_yr 的数据框是所需的最终数据集 - 然后在该数据集上完成另外两个计算,但不会添加到数据框中,因为它们是聚合平均值;谢谢
标签: python pandas if-statement group-by average