python - 对于不一致的日期范围,用零填充 pandas groupby

标签 python pandas data-manipulation

我有以下形式的汽车租赁预订数据:

location  |  day_of_drive |  day_of_reservation  |  number_of_bookings
-------------------------------------------------------------------
foo       |  01-01-2015   |  24-12-2014          |  1
foo       |  01-01-2015   |  26-12-2014          |  1
foo       |  01-01-2015   |  29-12-2014          |  3
foo       |  01-01-2015   |  30-12-2014          |  2
foo       |  01-01-2015   |  31-12-2014          |  1
foo       |  02-01-2015   |  29-12-2014          |  2
foo       |  02-01-2015   |  31-12-2014          |  1
foo       |  02-01-2015   |  01-01-2015          |  1
bar       |  25-06-2016   |  03-07-2016          |  1
.
.
.

我想要的是填充此数据集以包含进行 0 次预订的日期。

数据框已排序,首先按位置排序,然后按day_of_drive排序,然后按day_of_reservation排序。

我想要的是一种有效的方法,可以在 day_of_reservation 变量在该变量的第一个观察值之间填充零值,该值对应于该变量的第一次预订 day_of_drive/location 对,以及 day_of_drive ,对于给定的一对 位置 day_of_drive 本身。我遇到过使用拆栈,然后使用 fillna(0),然后堆叠回来的解决方案,但我不认为我可以将它们用作每对 locationday_of_drive 有一个不同的最小和最大日期,我想在之间填充。

期望的输出:

location  |  day_of_drive |  day_of_reservation  |  number_of_bookings
-------------------------------------------------------------------
foo       |  01-01-2015   |  24-12-2014          |  1
foo       |  01-01-2015   |  25-12-2014          |  0
foo       |  01-01-2015   |  26-12-2014          |  1
foo       |  01-01-2015   |  27-12-2014          |  0
foo       |  01-01-2015   |  28-12-2014          |  0
foo       |  01-01-2015   |  29-12-2014          |  3
foo       |  01-01-2015   |  30-12-2014          |  2
foo       |  01-01-2015   |  31-12-2014          |  1
foo       |  02-01-2015   |  29-12-2014          |  2
foo       |  02-01-2015   |  30-12-2014          |  0
foo       |  02-01-2015   |  31-12-2014          |  1
foo       |  02-01-2015   |  01-01-2015          |  1
bar       |  25-06-2016   |  03-07-2016          |  1
bar       |  25-06-2016   |  04-07-2016          |  0
.
.
.

我感觉解决方案是使用 groupby

最佳答案

您可以将以下内容与 set_indexgroupbyresample 结合使用:

#First make sure day_of_reservation is a datetime dtype:
df['day_of_reservation'] = pd.to_datetime(df['day_of_reservation'])

df.set_index('day_of_reservation')\
  .groupby(['location','day_of_drive'], sort=False)['number_of_bookings']\
  .resample('D').asfreq().fillna(0)\
  .reset_index()

输出:

      location     day_of_drive day_of_reservation  number_of_bookings
0   foo           01-01-2015            2014-12-24                 1.0
1   foo           01-01-2015            2014-12-25                 0.0
2   foo           01-01-2015            2014-12-26                 1.0
3   foo           01-01-2015            2014-12-27                 0.0
4   foo           01-01-2015            2014-12-28                 0.0
5   foo           01-01-2015            2014-12-29                 3.0
6   foo           01-01-2015            2014-12-30                 2.0
7   foo           01-01-2015            2014-12-31                 1.0
8   foo           02-01-2015            2014-12-29                 2.0
9   foo           02-01-2015            2014-12-30                 0.0
10  foo           02-01-2015            2014-12-31                 1.0
11  foo           02-01-2015            2015-01-01                 1.0
12  bar           25-06-2016            2016-03-07                 1.0

关于python - 对于不一致的日期范围,用零填充 pandas groupby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48827580/

相关文章:

python - 为什么不使用 .values 而不是 .iat 来获得 6 倍的性能提升?

python - 从 Pandas Groupby Dataframe 创建等高线图

python-3.x - python中的 Pandas 数据操作

r - 使用索引的数据框从数据框中提取值 - R

pandas - 无法使用FeatureUnion在Python中组合处理后的数字和分类特征

返回列表 r 中的向量位置

python - 为什么在解包元组时 var 类型会发生变化?

python - 使用 scikit-learn 对随机森林进行递归特征消除

python - 如何循环遍历 .txt 文件并搜索特定字符串?

python - 从交互式 shell 调用 d 代码