Python 使用熊猫计算未完成事件的数量

Python 使用熊猫计算未完成事件的数量,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个带有3个事件时间戳的数据帧:e0、e1和e2。其他列是行id和目标变量 为了进行说明,假设这是一个电子商务部分的数据集 e0:用户打开网站的时间 e1:用户选择项目的时间 e2:用户购买物品的时间 我想为每个用户统计(或计算其他统计数据),目前有多少用户处于事件1和事件2之间 我已设法使用pandasql,但没有使用本机pandas函数: import pandas as pd from pandas import Timestamp from pandasql import sql

我有一个带有3个事件时间戳的数据帧:e0、e1和e2。其他列是行id和目标变量

为了进行说明,假设这是一个电子商务部分的数据集

  • e0:用户打开网站的时间
  • e1:用户选择项目的时间
  • e2:用户购买物品的时间
我想为每个用户统计(或计算其他统计数据),目前有多少用户处于事件1和事件2之间

我已设法使用
pandasql
,但没有使用本机pandas函数:

import pandas as pd
from pandas import Timestamp
from pandasql import sqldf

df = pd.DataFrame({'id': {0: 0, 1: 1, 2: 2, 3: 3, 5: 5, 4: 4, 6: 6, 7: 7},
 'e0': {0: Timestamp('2020-01-01 12:00:00'),
  1: Timestamp('2020-01-01 12:10:00'),
  2: Timestamp('2020-01-01 12:11:00'),
  3: Timestamp('2020-01-01 12:20:00'),
  5: Timestamp('2020-01-01 12:20:00'),
  4: Timestamp('2020-01-01 12:24:00'),
  6: Timestamp('2020-01-01 12:50:00'),
  7: Timestamp('2020-01-01 12:55:00')},
 'e1': {0: Timestamp('2020-01-01 12:20:00'),
  1: Timestamp('2020-01-01 12:55:00'),
  2: Timestamp('2020-01-01 12:31:00'),
  3: Timestamp('2020-01-01 12:40:00'),
  5: Timestamp('2020-01-01 12:50:00'),
  4: Timestamp('2020-01-01 12:54:00'),
  6: Timestamp('2020-01-01 13:03:00'),
  7: Timestamp('2020-01-01 13:00:00')},
 'e2': {0: Timestamp('2020-01-01 12:25:00'),
  1: Timestamp('2020-01-01 13:00:00'),
  2: Timestamp('2020-01-01 12:36:00'),
  3: Timestamp('2020-01-01 12:56:00'),
  5: Timestamp('2020-01-01 13:30:00'),
  4: Timestamp('2020-01-01 12:58:00'),
  6: Timestamp('2020-01-01 13:50:00'),
  7: Timestamp('2020-01-01 13:20:00')},
 'target': {0: '100',
  1: '120',
  2: '110',
  3: '105',
  5: '120',
  4: '140',
  6: '130',
  7: '200'}})


sqldf("""
SELECT df1.id, COUNT(df2.id)
FROM df df1
JOIN df df2 ON df1.e0 > df2.e1 AND df1.e0 < df2.e2
GROUP BY df1.id

""")
将熊猫作为pd导入
从导入时间戳
从pandasql导入sqldf
数据帧({'id':{0:0,1:1,2:2,3:3,5:5,4:4,6:6,7:7},
'e0':{0:Timestamp('2020-01-01 12:00:00'),
1:时间戳('2020-01-01 12:10:00'),
2:时间戳('2020-01-01 12:11:00'),
3:时间戳('2020-01-01 12:20:00'),
5:时间戳('2020-01-01 12:20:00'),
4:时间戳('2020-01-01 12:24:00'),
6:时间戳('2020-01-01 12:50:00'),
7:时间戳('2020-01-01 12:55:00'),
“e1”:{0:Timestamp('2020-01-01 12:20:00'),
1:时间戳('2020-01-01 12:55:00'),
2:时间戳('2020-01-01 12:31:00'),
3:时间戳('2020-01-01 12:40:00'),
5:时间戳('2020-01-01 12:50:00'),
4:时间戳('2020-01-01 12:54:00'),
6:时间戳('2020-01-01 13:03:00'),
7:时间戳('2020-01-01 13:00:00'),
“e2”:{0:Timestamp('2020-01-01 12:25:00'),
1:时间戳('2020-01-01 13:00:00'),
2:时间戳('2020-01-01 12:36:00'),
3:时间戳('2020-01-01 12:56:00'),
5:时间戳('2020-01-01 13:30:00'),
4:时间戳('2020-01-01 12:58:00'),
6:时间戳('2020-01-01 13:50:00'),
7:时间戳('2020-01-01 13:20:00'),
'target':{0:'100',
1: '120',
2: '110',
3: '105',
5: '120',
4: '140',
6: '130',
7: '200'}})
sqldf(“”)
选择df1.id,计数(df2.id)
来自df df1
在df1.e0>df2.e1和df1.e0
或者,就像我说的,计算统计数据:

sqldf("""

SELECT df1.id, AVG(df2.target)
FROM df df1
JOIN df df2 ON df1.e0 > df2.e1 AND df1.e0 < df2.e2
GROUP BY df1.id
""")
sqldf(“”)
选择df1.id,平均值(df2.target)
来自df df1
在df1.e0>df2.e1和df1.e0
使用
df.merge
query
操作作为过滤器,您可以在查询中获得相同的结果

对于您的第一个查询:

res1=df.assign(key=1.merge)(
df.分配(键=1),
on=“key”,
后缀=[“”,“_2”]
).查询(
“e0>e1_2&e0
关于第二个问题:

df[“target”]=df.target.astype(int)
res2=df.assign(key=1.merge)(
df.分配(键=1),
on=“key”,
后缀=[“”,“_2”]
).查询(
“e0>e1_2&e0
信息不足。我们不清楚处于事件1和事件2之间的用户是什么样子。没有期望的输出。嘿,期望的输出非常像foglerit PresentedHanks!这适用于玩具示例,但随着数据帧的增长,它会爆炸。我正在寻找一个具有类似性能的解决方案