1

我有这些数据(多个查询,每个查询有多个变量,每个变量有多个持续时间):

进口熊猫作为pddf=pd.DataFrame(数据帧)({“查询”:[“q1”,“q1,“变体”:[“a”,“a”、“b”、“c”、“a”],“持续时间”:[50、40、30、20、90],})

我希望有一个数据帧,其中包含每个查询的最快持续时间,每个查询中的变量按持续时间排序。

这几乎奏效:

df.groupby(“查询”).apply(lambda x:x.groupby(“变体”).应用(λx:x.sort_values(“持续时间”).head(1),include_groups=False).sort_values(“持续时间”),include_groups=假)

在此处输入图像描述

但我想删除标记的行号列。我还想知道是否有更好的方法来获得这个结果。

0

2个答案2

重置为默认值
1

不使用嵌套子句,这是非常低效的,排序值删除副本(_D):

out=(df.sort_values(by=[“查询”,“持续时间”,“变量”]).drop_duplicates(['query','variant'],ignore_index=True))

输出:

查询变量持续时间0问题1 c 201问题1 b 302问题1 a 403问题2 a 90

或者,如果行的最终顺序无关紧要,分组.idxmin:

out=df.loc[df.groupby(['query','variant'])['duration'].idxmin()]

输出:

查询变量持续时间1问题1 a 402季度1 b 303问题1 c 204问题2 a 90

为了完整起见,您需要添加一个水位下降您的方法:

df.groupby(“查询”).apply(lambda x:x.groupby(“变体”).apply(λx:x.sort_values(“持续时间”).head(1),include_groups=False).sort_values(“持续时间”),include_groups=False).droplevel(-1)

输出:

期间查询变量问题1 c 20b 30岁a 40岁问题2 a 90
0

只需创建多索引DataFrame并按期间列:

df.set_index(['query','variant']).sort_values(“持续时间”)

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.