我有一个看起来像这样的数据框
customer Start_date End_date
100 2016-06-01 2018-01-01
101 2017-06-01 2019-01-01
102 2016-04-01 2017-04-01
103 2015-06-03 2016-01-01
104 2016-06-01 2018-01-01
现在我想创建一个带有周期索引的数据框,该索引具有一个列,其中包含每个周期的客户数量,如下所示:
Period Customers
2017-01 3
2017-02 5
2017-03 8
2017-04 9
我已经编写了一个自定义的 for 循环来执行此操作,但效率非常低。必须有一种更快的方法来使用 Pandas 功能来完成这项工作。任何帮助是极大的赞赏!
最佳答案
首先,确保日期没问题:
df.Start_date = pd.to_datetime(df.Start_date)
df.End_date = pd.to_datetime(df.End_date)
创建一个虚拟列,并使用它来合并所有期间:
df['dummy'] = 1
merged = pd.merge(
df,
pd.DataFrame({'Period': pd.date_range(df.Start_date.min(), df.End_date.max(), freq='M'), 'dummy': 1}),
how='outer')
保留期间位于开始日期和结束日期之间的所有行:
merged = merged[(merged.Start_date <= merged.Period) & (merged.End_date >= merged.Period)]
现在计算每个时期的客户:
>>> merged.customer.groupby(merged.Period).nunique()
Period
2015-06-30 1
2015-07-31 1
2015-08-31 1
2015-09-30 1
2015-10-31 1
2015-11-30 1
2015-12-31 1
2016-04-30 1
2016-05-31 1
2016-06-30 3
2016-07-31 3
2016-08-31 3
2016-09-30 3
2016-10-31 3
...
关于python - 计算属于 Pandas 时期的行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50308794/