2017-10-24 15 views
1

から最初の2行は、どのように私はエレガントなインデックスの最初のレベルによってIグループ場合は最初の2つのグループの最初の2行を得るのですかdf最初の2つのグループ

mux = pd.MultiIndex.from_arrays([ 
    list('aaaabbbbbccdddddd'), 
    list('tuvwlmnopxyfghijk') 
], names=['one', 'two']) 

df = pd.DataFrame({'col': np.arange(len(mux))}, mux) 

df 

     col 
one two  
a t  0 
    u  1 
    v  2 
    w  3 
b l  4 
    m  5 
    n  6 
    o  7 
    p  8 
c x  9 
    y  10 
d f  11 
    g  12 
    h  13 
    i  14 
    j  15 
    k  16 

データフレームを考えてみなさい:

  col 
one two  
a t  0 
    u  1 
b l  4 
    m  5 

答えて

2

オプション1
あなたはリストカンプpd.concatを使用することができます。

pd.concat([g.head(2) for _, g in df.groupby(level=0)][:2]) 

     col 
one two  
a t  0 
    u  1 
b l  4 
    m  5 

リストコンプリート完了は不要なオーバーヘッドなので、これを防ぐにはitertools.takewhileを使用できます。

it = itertools.takewhile(lambda x: x[0] < 2, enumerate(df.groupby(level=0))) 
pd.concat([g.head(2) for _, (_, g) in it]) 

     col 
one two  
a t  0 
    u  1 
b l  4 
    m  5 


オプション2私は、インデックスレベル0の唯一の最初の2つの値の行を保持するためにあなたのDFを事前にフィルタリングされたのだと思うし、その後GROUPBYを行うことができます別の可能な解決策。

# https://stackoverflow.com/a/46900625/4909087 
df.loc[df.index.levels[0][:2].values].groupby(level=0).head(2) 

     col 
one two  
a t  0 
    u  1 
b l  4 
    m  5 
+0

を試みたものです。私は早くそれを壊す方法があるのだろうかと思います。 – piRSquared

+0

@piRSquaredオプション2を手に入れました。 –

1

はハック見えるが、これは、私はあなたの理解が完全に完了する

df.groupby(level=['one']).head(2)[:4] 


     col 
one two 
a t 0 
u 1 
b l 4 
m 5 
+0

確かに、リストよりもきれいです! –

関連する問題