对于下面的给定数据集,我能够计算对酒店的“不同”访问,这被定义为旅行者至少在一个完整日历日到达的任何访问(即,2天或以上)。任何抵达时间距上次访问不足一个完整日历日的,将与上次访问合并。负的days_between_visits
模拟在整个数据集中发现的一些数据错误。
我通过运行以下命令获得新的开始日期:df["NewStartDate"] = df.groupby((df["days_between_visits"]>=2).cumsum().shift().fillna(0))["arrival_date "].transform("min")
个
并通过运行以下命令获取新的结束日期:df["NewEndDate"] = df.groupby((df["days_between_visits"]>=2).cumsum().shift().fillna(0))["departure_date "].transform("max")
检查here,以获得有关NewStartDate
和NewEndDate
的附加信息。
| 识别码|到达日期|出发日期|访问间隔天数|
| - -|- -|- -|- -|
| 一个|2010年4月1日|2010年4月2日|第0页|
| 一个|2010年4月2日|2010年4月2日|一个|
| 一个|2010年4月3日|2010年4月3日|一个|
| 一个|2010年4月4日|2010年4月4日|一个|
| 一个|2010年4月5日|2010年4月5日|十五个|
| 一个|2010年4月20日|2010年4月21日|-1个|
| 一个|2010年4月20日|2010年4月22日|-2个|
| 一个|2010年4月20日|2010年4月27日|三十九|
| 一个|2010年6月5日|2010年6月5日|一个|
| 一个|2010年6月6日|2010年6月6日|2个|
| 一个|2010年6月8日|2010年9月22日|三百七十五人|
| 一个|2011年10月1日|2011年10月2日|第0页|
| 一个|2011年10月2日|2011年10月4日|一个|
| 一个|2011年10月5日|2011年10月6日|八十七人|
| 一个|2012年1月1日|2012年1月2日||
问题:我不明白条件groupby
与.cumsum()
之间发生了什么。条件groupby
(单独)返回两个组(即,访问间隔〈2天的组(即False
组)和访问间隔〉=2天的组(即True
组)。当将.cumsum()
添加到流程中时,只有在创建了新组之后,我们才能得到每个组中days_between_visits
的累积和BUT,这些新组在groupby
中的条件为True
时被拆分(即,每行中days_between_visits >= 2
是新组的开始)。有人能解释一下这里发生了什么,以及为什么x1m15
最终结果:
| 识别码|到达日期|出发日期|访问间隔天数|新开始日期|新结束日期|
| - -|- -|- -|- -|- -|- -|
| 一个|2010年4月1日|2010年4月2日|第0页|2010年4月1日|2010年4月5日|
| 一个|2010年4月2日|2010年4月2日|一个|2010年4月1日|2010年4月5日|
| 一个|2010年4月3日|2010年4月3日|一个|2010年4月1日|2010年4月5日|
| 一个|2010年4月4日|2010年4月4日|一个|2010年4月1日|2010年4月5日|
| 一个|2010年4月5日|2010年4月5日|十五个|2010年4月1日|2010年4月5日|
| 一个|2010年4月20日|2010年4月21日|-1个|2010年4月20日|2010年4月27日|
| 一个|2010年4月20日|2010年4月22日|-2个|2010年4月20日|2010年4月27日|
| 一个|2010年4月20日|2010年4月27日|三十九|2010年4月20日|2010年4月27日|
| 一个|2010年6月5日|2010年6月5日|一个|2010年6月5日|2010年6月6日|
| 一个|2010年6月6日|2010年6月6日|2个|2010年6月5日|2010年6月6日|
| 一个|2010年6月8日|2010年9月22日|三百七十五人|2010年6月8日|2010年9月22日|
| 一个|2011年10月1日|2011年10月2日|第0页|2011年10月1日|2011年10月6日|
| 一个|2011年10月2日|2011年10月4日|一个|2011年10月1日|2011年10月6日|
| 一个|2011年10月5日|2011年10月6日|八十七人|2011年10月1日|2011年10月6日|
| 一个|2012年1月1日|2012年1月2日||2012年1月1日|2012年1月2日|
1条答案
按热度按时间y4ekin9u1#
让我们一点一点地做:
(df["days_between_visits"]>=2)
返回一个布尔序列。我们将此序列视为int64,因为pandas
允许对布尔序列(with False == 0
和True == 1
)执行一些整数运算。当我们在布尔级数上执行
.cumsum()
时,我们会得到以下结果:然而,由于
True
值是对给定的酒店访问的最后一行的指示(即,距下一次访问访问〉=2天),我们需要通过将数据向下移动(即,shift()
)一行来将包含True
(即,1
)值的行包括到访问中,从而产生以下:现在我们可以使用
fillna(0)
,我们有了不同的组。我们现在可以使用groupby这个新创建的序列,并根据需要对arrival_date
和departure_date
执行变换函数。