使用单索引布尔索引器获取MultiIndex Pandas DataFrame的子集

时间:2016-09-14 18:40:27

标签: 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的组长于1,我可以做到这一点,但它很慢:

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

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

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

但是布尔索引器只有id作为索引:

id
1    False
2     True
3     True

我想也许我给了更多的上下文,但是如何使用带有单个索引的布尔索引器从具有MultiIndex的数据帧中获取子集?期望的输出将是:

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

1 个答案:

答案 0 :(得分:0)

使用groupbytransform构建掩码

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

enter image description here