在Pandas中按组过滤

我有以下数据框

 df = pd.DataFrame(dict(g = [0, 0, 1, 1, 2, 2], x = [0, 1, 1, 2, 2, 3]))

我想从g这样的组中获取这个数据帧的一个子集mean(x) > 0.6。也就是说,我想要一个filter_group操作来获取以下数据帧:

>>> filtered_df = filter_group(df)
>>> filtered_df
   g  x
2  1  1
3  1  2
4  2  2
5  2  3

有没有一种简单的方法可以在熊猫中做到这一点?这类似于havingSQL 中的操作,但有点不同,因为我想获取具有相同架构但行数较少的数据帧。


对于 R 用户,我想做的是:

library(dplyr)
df <- tibble(
  g = c(0, 0, 1, 1, 2, 2),
  x = c(0, 1, 1, 2, 2, 3)
)

df %>% 
  group_by(g) %>% 
  filter(mean(x) > 0.6)

回答

使用GroupBy.transform每对可能的过滤器的原始值组reepat聚合值boolean indexing

df[df.groupby('g')['x'].transform('mean') > 0.6]

如果性能很重要,如果大型 DataFrame 或许多组,此解决方案会更好:

np.random.seed(2020)

N = 10000
df = pd.DataFrame(dict(g = np.random.randint(1000, size=N), 
                       x = np.random.randint(10000, size=N)))
print (df)
        

In [89]: %timeit df[df.groupby('g')['x'].transform('mean') > 0.6]
2.01 ms ± 103 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [90]: %timeit df.groupby('g').filter(lambda df: df['x'].mean() > 0.6)
145 ms ± 2.2 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)


以上是在Pandas中按组过滤的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>