Pandas相当于data.table

时间:2017-07-31 16:24:04

标签: python pandas

使用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解决方案...

1 个答案:

答案 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