【问题标题】:Padding pandas groupby with zeros for inconsistent date ranges对于不一致的日期范围,用零填充 pandas groupby
【发布时间】:2018-02-16 13:13:23
【问题描述】:

我有租车预订数据,格式如下:

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 次预订的日期。

数据框已经排序,首先是location,然后是day_of_drive,然后是day_of_reservation

我想要的是一种有效的方法,用零值填充 day_of_reservation 变量在此变量的第一个观察值之间,这对应于此变量的第一次预订 day_of_drive/@987654327 @ pair,和 day_of_drive ,对于给定的一对 location day_of_drive 本身。我遇到了使用 unstacking,然后使用 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

【问题讨论】:

    标签: python pandas data-manipulation


    【解决方案1】:

    您可以将以下内容与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
    

    【讨论】:

    • 这是我试图做的,但无法弄清楚重新采样。保存它,干得好。
    【解决方案2】:

    应该这样做:

    df['date_of_reservation'] = pd.to_datetime(df['date_of_reservation'])
    
    df_date = pd.DataFrame(df.groupby(pd.Grouper(key='date_of_reservation', freq="d"))['number_of_bookings'].mean())
    df_date=df_date.reset_index()
    
    df2=pd.merge(df,df_date[['date_of_reservation']], on='date_of_reservation', how='right').sort_values('date_of_reservation')
    df2.loc[df2['number_of_bookings'].isnull(), 'number_of_bookings'] = 0
    df2.fillna(method='ffill', inplace=True)
    

    【讨论】:

      猜你喜欢
      • 2016-11-04
      • 2019-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-31
      • 2019-03-31
      • 1970-01-01
      相关资源
      最近更新 更多