使用R
&#39> 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组)DataFrame,里面有行列表,但这看起来并不奇怪,因为sort会返回一个列表对象。
# 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')
知道我可以用什么作为更优雅的方式来执行此操作? 谢谢,我继续寻找Pythonic解决方案...
答案 0 :(得分:2)
IIUC:
n = 100
df = pd.DataFrame({'A' : np.random.randn(n),
'B' : [np.random.choice(list('abc')) for i in range(n)]})
groups = df.groupby('B')
groups.apply(lambda x : x['A'].sort_values().tail(5))
输出:
B
a 97 1.068696
26 1.142186
35 1.222854
18 1.379540
43 1.466977
b 46 1.185664
94 1.206992
49 1.464562
81 1.609808
51 1.814868
c 50 1.129484
8 1.155544
95 1.250349
9 1.337286
90 1.581751
Name: A, dtype: float64