python - 使用单索引 bool 索引器获取 MultiIndex Pandas DataFrame 的子集

标签 python pandas

如果我有这个数据框

import pandas as pd
tuples_index = [(1,1990), (2,1999), (2,2002), (3,1992), (3,1994), (3,1996)]
index = pd.MultiIndex.from_tuples(tuples_index, names=['id', 'FirstYear'])
df = pd.DataFrame([2007, 2006, 2006, 2000, 2000, 2000], index=index, columns=['LastYear'] )

df
Out[2]: 
              LastYear
id FirstYear          
1  1990           2007
2  1999           2006
   2002           2006
3  1992           2000
   1994           2000
   1996           2000

我想获取数据框的一个子集,其中基于 id 的组长于一个,我可以这样做,但速度很慢:

%timeit df.groupby(level=0).filter(lambda x: len(x) > 1)
1000 loops, best of 3: 1.36 ms per loop

我的 df 有数千万行和大量的组(大多数组都是 len 1)所以时间加起来。我可以通过这种方式更快地获得 bool 索引器:

%timeit df.groupby(level=0).size() > 1
1000 loops, best of 3: 364 µs per loop

但是 bool 索引器只有 id 作为它的索引:

id
1    False
2     True
3     True

我想我可能提供了比必要更多的上下文,但是我如何使用具有单个索引的 bool 索引器从具有 MultiIndex 的数据帧中获取子集?期望的输出是:

              LastYear
id FirstYear          
2  1999           2006
   2002           2006
3  1992           2000
   1994           2000
   1996           2000

最佳答案

使用groupbytransform 构建掩码

df[df.groupby(level=0).transform(np.size).gt(1).values]

enter image description here

关于python - 使用单索引 bool 索引器获取 MultiIndex Pandas DataFrame 的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39497487/

相关文章:

python - 如何在函数调用中将 DataFrame 解包为单独的系列?

python - 在 django-rest-framework 中出现数据库验证错误后如何返回状态代码?

python - 在 zeppelin 中将 pandas 数据帧转换为 RDD

python - 如何修复 StreamlitAPIException : ("Expected bytes, got a ' int' object", 'Conversion failed for column FG% with type object' )

python - 在访问日志中标记并总结每月的差距(流失)

Pandas 重采样 : add columns of group_id

python - 使用 python 计算数学表达式而不使用多个函数的算法

python - 保存数据的有效方法

python-3.x - 为什么我会收到 Pandas 的 HTTP 403 错误?

python - 如何用 pandas 截断日期时间列?