在執行groupby操作時,有很多關于每組排序的答案,但是在我的案例中,我先groupby然后使用聚合列來創建另一個列。我想按照每組新創建的列進行排序。
MRE:
df = pd. DataFrame({"A"/span>: [1,1,1,3,3, 3, 1,1,1,3,3] 。
"B"。 ["a"/span>, "b"/span>, "c"/span>, "a"/span>, "b"/span>, "c", "a"/span>, "b"/span>, "c", "a"/span>, "b"/span>, "c"/span>] 。
"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"/span>, "B"/span>]).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[/span
c 246 30000 0.820000[/span].
3 a 666 30000 2.220000
b 444 30000 1.480000[/span
c 666 30000 2.220000
期望的輸出:
click exp ctr
A B
1 b 400 30000 1.333333[/span
c 246 30000 0.820000[/span].
a 200 30000 0.666667[/span].
3 a 666 30000 2.220000
c 666 30000 2.220000
b 444 30000 1.480000
uj5u.com熱心網友回復:
你可以groupby 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)
點擊 exptr
A B
1 b 400 30000 1.333333[/span
c 246 30000 0.820000[/span].
a 200 30000 0.666667[/span].
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)
uj5u.com熱心網友回復:
你可以使用sort_values,并將grouper與新列配對:
grp_df. sort_values(['A', 'ctr'], ascending = [True, False] )
點擊 exp ctr
A B
1 b 400 30000 1.333333[/span
c 246 30000 0.820000[/span].
a 200 30000 0.666667[/span].
3 a 666 30000 2.220000
c 666 30000 2.220000
b 444 30000 1.480000
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/307657.html
標籤:
