Python 从dataframe获取项目A的第一个订单和前一个订单(可以是项目A或不同的项目)之间的天数

Python 从dataframe获取项目A的第一个订单和前一个订单(可以是项目A或不同的项目)之间的天数,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我有一个数据框架,包括一年内所有客户的所有订单。 我想知道两次订单之间的平均天数: 第二个订单需要是一个特定的项目。我称之为A项。此项必须是客户第一次或第二次订购。 第一个订单可以是项目A或任何其他项目。第一次订购并不意味着是客户第一次订购。这只是先前的订单 下面是初始表的一个示例。它以粗体显示我感兴趣的行。 为了得到天数的差异,我需要找到一种方法以粗体显示数据 我尝试过不同的方法,比如groupby().first()或nth(),但没有一种方法完全符合我的要求 顾客 日期 项目A B项 客户

我有一个数据框架,包括一年内所有客户的所有订单。 我想知道两次订单之间的平均天数: 第二个订单需要是一个特定的项目。我称之为A项。此项必须是客户第一次或第二次订购。 第一个订单可以是项目A或任何其他项目。第一次订购并不意味着是客户第一次订购。这只是先前的订单

下面是初始表的一个示例。它以粗体显示我感兴趣的行。 为了得到天数的差异,我需要找到一种方法以粗体显示数据

我尝试过不同的方法,比如groupby().first()或nth(),但没有一种方法完全符合我的要求

顾客 日期 项目A B项 客户1 2020/03/01 0 1. 客户2 2020/03/02 1. 0 客户3 2020/03/03 0 1 客户3 2020/03/04 1 0 客户3 2020/03/05 1. 0 客户4 2020/03/06 0 1. 客户4 2020/03/07 0 1. cust 4 2020/03/08 0 1 cust 4 2020/03/09 1 0 客户4 2020/03/10 1. 0 客户4 2020/03/11 1. 0 cust 5 2020/03/14 1 0 cust 5 2020/03/15 1 0
首先,让我们确保
日期
是一个
时间戳
,并为每个客户订购:

df=df.assign(date=pd.to_datetime(df['date'])。排序_值(['customer','date']))
那么,就我所理解的逻辑而言,它是:

  • 对于每个客户,主要考虑的顺序是,在所有客户订单中,第一个订单包含
    “项目A”
    ,第一个除外
  • 时间差在该顺序和前一顺序之间
表达这种逻辑的一种方式是:

gb=df.groupby('customer'))
a=gb['item a'].cumsum()
n=gb.cumcount()
掩码=((a==1)和(n>0))|((a==2)和(n==1))
然后,您可以选择该“考虑顺序”及其前一个:

out=df.loc[mask | mask.shift(-1)]
这提供了OP希望获得的数据帧:

>>输出
客户日期项目A项目B
2 cust 3 2020-03-03 0 1
3客户3 2020-03-04 10
7客户4 2020-03-08 01
8客户4 2020-03-09 10
12 cust 5 2020-03-13 0 0 0
13客户5 2020-03-14 10
或者,直接获得两个订单之间的平均时差:

avg_dt=df['date'].diff()[mask].mean()
#时间差('1天00:00:00')

是否可以添加预期的输出形状,仅添加一个包含客户和日期差异的表格?你想让客户像cust1一样不满足要求吗?如果是,您希望表中的值是多少?嗨,本,我已经编辑了我的问题。我的问题更多的是如何使输出表高于平均值。如果我可以有这个输出表,那么我将能够得到平均值。订单是否可以同时包含这两个项目?是的,这是可能的。项目A是一个特定的项目,项目B可以是任何其他项目,但不是A。客户可以在同一订单上购买项目A和BHi Pierre,很抱歉,这不是我所期望的。在考虑差异之前,有一些条件。我正在尝试获取上面显示的输出表或类似的输出表。它与您期望的输出表有什么不同?如果您查看我的输出表,如果客户在不同的月份购买了该商品5次,我唯一感兴趣的是第一批订单中的2次。如果客户第一次和第二次购买B项,然后购买a项3次(B、B、a、a、a),那么我只对订单2和订单3感兴趣,请根据附加说明重新编写答案。哦,非常感谢。你的第一个答案以另一种方式帮助我得到了结果:就在你的:
df.groupby('customer')['date'].diff()之后,我添加了:
df=df[(df['dt']!=NaT&df['item']='item A')]df=df.groupby('customer').first()