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