带有布尔条件的groupby对象上的Pandas累积和

o4tp2gmn  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(209)

对于下面的给定数据集,我能够计算对酒店的“不同”访问,这被定义为旅行者至少在一个完整日历日到达的任何访问(即,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,以获得有关NewStartDateNewEndDate的附加信息。
| 识别码|到达日期|出发日期|访问间隔天数|
| - -|- -|- -|- -|
| 一个|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日|

y4ekin9u

y4ekin9u1#

让我们一点一点地做:(df["days_between_visits"]>=2)返回一个布尔序列。我们将此序列视为int64,因为pandas允许对布尔序列(with False == 0True == 1)执行一些整数运算。

当我们在布尔级数上执行.cumsum()时,我们会得到以下结果:

然而,由于True值是对给定的酒店访问的最后一行的指示(即,距下一次访问访问〉=2天),我们需要通过将数据向下移动(即,shift())一行来将包含True(即,1)值的行包括到访问中,从而产生以下:

现在我们可以使用fillna(0),我们有了不同的组。我们现在可以使用groupby这个新创建的序列,并根据需要对arrival_datedeparture_date执行变换函数。

相关问题