在pandas中,我如何先做group_by,然后做sum,再根據sum取前兩名?
我試過很多方法,包括以下方法。
df.groupby(['A','B'])['C']。 sum().groupby(['A'/span>]).nlargest(2,'C'/span>)
df.groupby(['A','B'])['C'].sum() 。 groupby(['A']).apply(lambda x:nlargest(2)
我想根據A和B的組合得到C的總和,然后根據A組內的總和過濾出前兩名。
謝謝你。
這里是資料:
A B C
阿拉巴馬州a 100
阿拉巴馬州b 50
阿拉巴馬州 c 40
阿拉巴馬州 d 5
阿拉巴馬州e 1
...
懷俄明州a.51 180 ...
懷俄明州b.51150
懷俄明州c.5156
懷俄明州d.515
uj5u.com熱心網友回復:
基于你的樣本資料,你可以嘗試:
(df. groupby(['A', 'B'], as_index=False) ['C'].sum()
.groupby('A')['C'].nlargest( 2)
.droplevel(1)
)
資料輸入:
A B C
0 Alabama a 100
1 阿拉巴馬州b 50
2 阿拉巴馬州 c 40
3 阿拉巴馬州 d 5
4 阿拉巴馬州 e 1
5 Wyoming a.51 180
6 懷俄明州b.51 150
7 懷俄明州c.51 56
8 Wyoming d.51 5
輸出:
A
阿拉巴馬州100
阿拉巴馬州 50
懷俄明州180
懷俄明州150
名稱。C, dtype: int64
擴展的測驗案例
讓我們用更多的資料試試,以顯示第一個groupby()的作業情況,以及再次被A分組后的作業情況:
資料輸入
A B C
0 Alabama a 100
1 阿拉巴馬州b 50
2 阿拉巴馬州 b 250
3 阿拉巴馬州 c 40
4 阿拉巴馬州 d 5
5 阿拉巴馬州 d 355
6 阿拉巴馬州 e 1
7 Wyoming a.51 180
8 懷俄明州b.51 150
9 懷俄明州c.51 56
10 Wyoming c.51 556
11 Wyoming d.51 5
12 Wyoming d.51 820
輸出
A
阿拉巴馬州360
阿拉巴馬州 300
懷俄明州825
懷俄明612州
名稱。C, dtype: int64
編輯
如果你想顯示所有的列,你可以使用:(df. groupby(['A','B'], as_index=False) ['C'].sum()
.groupby(['A']).apply(lambda x: x.nlargest(2,'C')
.reset_index(drop=True)
)
資料輸入
A B C
0 Alabama a 100
1 阿拉巴馬州b 50
2 阿拉巴馬州 b 250
3 阿拉巴馬州 c 40
4 阿拉巴馬州 d 5
5 阿拉巴馬州 d 355
6 阿拉巴馬州 e 1
7 Wyoming a.51 180
8 懷俄明州b.51 150
9 懷俄明州c.51 56
10 Wyoming c.51 556
11 Wyoming d.51 5
12 Wyoming d.51 820
輸出
A B C
0Alabama d 360
1 阿拉巴馬州b 300
2 懷俄明州 d.51 825[/span]。
3 Wyoming c.51 612
uj5u.com熱心網友回復:
你需要在groupby之后指定你要應用nlargest的列。請嘗試:
>>> df.groupby(["A"/span>,"B"/span>] )。) sum().groupby("A")["C"].nlargest(2)
uj5u.com熱心網友回復:
我把這個問題解決了,但是仍然在尋找更好的解決方案。
df.groupby(['A'/span>,'B'/span>])['C'/span>]。 sum().reset_index().groupby(['A'/span>])。 apply(lambda x:nlargest(2,'C')
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/307673.html
標籤:
