我有这个数据(多个查询,每个查询有多个变体,每个变体有多个持续时间):
import pandas as pd
df = pd.DataFrame({
"query": ["q1", "q1", "q1", "q1", "q2" ],
"variant": [ "a", "a", "b", "c", "a" ],
"duration": [ 50, 40, 30, 20, 90 ],
})
我希望有一个数据框,其中包含每个查询、每个变体的最快持续时间,并且每个查询中的变体按其持续时间排序。
这几乎有效:
df.groupby("query").apply(
lambda x: x.groupby("variant").apply(
lambda x: x.sort_values("duration").head(1)
, include_groups=False).sort_values("duration")
, include_groups=False)
但我想删除标记的行号列。我也想知道是否有更好的方法来获得这个结果。
不要使用嵌套
groupby
,这是非常低效的,而是排序和drop_duplicates
:
out = (df.sort_values(by=['query', 'duration', 'variant'])
.drop_duplicates(['query', 'variant'])
)
输出:
query variant duration
3 q1 c 20
2 q1 b 30
1 q1 a 40
4 q2 a 90