與R
的data.table
,您可以按列返回一個任意長度的向量的列執行操作。大熊貓相當於data.table
假設,我想收集一列中的前5個值,按另一列分組。 data.table
負責粘合子組。
require(magrittr)
library(data.table)
n <- 100
DT <- data.table(A = rnorm(n), B = sample(letters[1:4], n, replace = TRUE))
DT[, sort(B, decreasing = TRUE) %>% head(5), by = B]
隨着Python
和pandas
,我嘗試了不同的策略:
import pandas as pd
import random
n = 100
df = pd.DataFrame({'A' : np.random.randn(n),
'B' : [random.choice(list('abc')) for i in range(n)]})
# first try :
groups = df.groupby('B')
groups.apply(lambda x : sorted(x['A'], reverse=False)[:5])
但這種方法還給一個3X1(假設我有3組)數據框與行內的名單,這不看起來很奇怪,因爲排序會返回一個列表對象。
# second try:
groups.apply(lambda x : np.sort(x['A'])[-5:])
沒有更確切的結論。
我發現,但看起來真的詳細到我的解決方案,意味着迭代組:
dfs = []
for g in groups:
dfs.append(g[1].sort_values('A').tail(5))
pd.concat(dfs).sort_values('B')
什麼,我能爲執行此操作更優雅的方式使用任何想法? 謝謝,我一直在尋找一個Python的解決方案...
怎麼是'df.groupby( 'B')申請(拉姆達x:x.sort_values(by ='A',ascending = False).head(5))'? – Abdou
Fwiw,更多的標準R代碼是'DT [order(-A),head(.SD,5),by = B]' – Frank
這確實有幫助。好點子 ! – user8131