gpt4 book ai didi

pandas - 在已经分组的数据框中对每组的值进行排序

转载 作者:行者123 更新时间:2023-12-04 14:03:46 25 4
gpt4 key购买 nike

在执行 groupby 操作时,有很多关于按组排序的答案,但是在我的例子中,我 groupby 然后使用聚合列来创建另一个列。我想按每组新创建的列进行排序。

MRE:

df = pd.DataFrame({"A":[1,1,1,3,3,3, 1,1,1,3,3,3],
"B":["a", "b", "c", "a", "b", "c", "a", "b", "c", "a", "b", "c"],
"click":[100, 200, 123, 333, 222, 333, 100, 200, 123, 333, 222, 333],
"exp":[10000, 10000, 10000, 10000, 10000, 10000, 20000, 20000, 20000, 20000, 20000, 20000]})

grp_df = df.groupby(["A", "B"]).sum()
grp_df["ctr"] = grp_df["click"] / grp_df["exp"] * 100

输出:

        click   exp     ctr
A B
1 a 200 30000 0.666667
b 400 30000 1.333333
c 246 30000 0.820000
3 a 666 30000 2.220000
b 444 30000 1.480000
c 666 30000 2.220000

期望的输出:

        click   exp     ctr
A B
1 b 400 30000 1.333333
c 246 30000 0.820000
a 200 30000 0.666667
3 a 666 30000 2.220000
c 666 30000 2.220000
b 444 30000 1.480000

最佳答案

您可以按 A(level=0)进行分组,然后按 ctr 列对 sort_values 进行分组:

grp_df.groupby(level=0).apply(
lambda g: g.sort_values('ctr', ascending=False)
).reset_index(level=0, drop=True)

click exp ctr
A B
1 b 400 30000 1.333333
c 246 30000 0.820000
a 200 30000 0.666667
3 a 666 30000 2.220000
c 666 30000 2.220000
b 444 30000 1.480000

或者正如@haneulkim 评论的那样,一个更简洁的选项是 group_keys=False:

grp_df.groupby(level=0, group_keys=False).apply(
lambda g: g.sort_values('ctr', ascending=False))

关于pandas - 在已经分组的数据框中对每组的值进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69201939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com