Python 通过熊猫桌子分组的蟒蛇式方法

Python 通过熊猫桌子分组的蟒蛇式方法,python,pandas,Python,Pandas,我有下表: dt type item 0 2021-02-08 20:43:15 Requesting 1111 1 2021-02-08 20:43:25 Response 1111 2 2021-02-08 20:43:15 Requesting 2222 3 2021-02-08 20:43:27 Response 2222 4 2021-02-08 20:43:16 Requesting 3333 5 2021-02-08 20:

我有下表:

    dt  type    item
0   2021-02-08 20:43:15 Requesting  1111
1   2021-02-08 20:43:25 Response    1111
2   2021-02-08 20:43:15 Requesting  2222
3   2021-02-08 20:43:27 Response    2222
4   2021-02-08 20:43:16 Requesting  3333
5   2021-02-08 20:43:19 Response    3333
6   2021-02-08 20:43:16 Requesting  4444
7   2021-02-08 20:43:21 Response    4444
8   2021-02-08 20:43:16 Requesting  5555
9   2021-02-08 20:43:23 Failed      5555
8   2021-02-08 20:43:17 Requesting  5555
9   2021-02-08 20:43:29 Response    5555
它已按项目排序,然后按时间进行第二次排序

我想做一个group by并得到一个新表,该表将包含从请求到响应之间所用的时间,以及另一列所包含的行数(因此对于项目5555,需要4行)


什么是好的python方法呢?

因为您的数据帧已经按照项目和时间进行了排序,我们只需要添加一列来指示行号(使用一个简单的
范围(len(df))

然后我们可以按
(也可以
保留第一个
'last'
删除重复的
)分组,以获得第一个请求(时间和行号)和最后一个响应,然后减去(在
'item'
上对齐)以找到时差和行数

#df = df.sort_values(['item', 'dt'])
df['dt'] = pd.to_datetime(df['dt'])
df['Nrows'] = range(len(df))

# First request row
reqs = (df.query('type == "Requesting"')
          .groupby('item').head(1)
          .set_index('item').drop(columns='type'))

# Last response row
resp = (df.query('type == "Response"')
          .groupby('item').tail(1)
          .set_index('item').drop(columns='type'))

result = resp - reqs
result['Nrows'] = result['Nrows']+1   # To get counting correct


一个项目是否只有一个请求和响应?这可以简单到一个
groupby
+
size
np.ptp
,但是如果您可能有多次,或者请求-响应行之外的失败行处理这些可能的边缘情况,将使解决方案复杂化我更正了数据以显示可能的情况。我正在寻找每个项目的第一个请求和最后一个响应之间的差异(这些行之间的时间,以及它们之间的行数)。太好了。非常感谢,工作很有魅力!
                  dt  Nrows
item                       
1111 0 days 00:00:10      2
2222 0 days 00:00:12      2
3333 0 days 00:00:03      2
4444 0 days 00:00:05      2
5555 0 days 00:00:13      4