2017-10-24 4 views
1

Betrachten Sie den Datenrahmen dfHolen ersten beiden Reihen von ersten beiden Gruppen

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 

Wie kann ich elegant die ersten beiden Reihen der ersten beiden Gruppen, wenn ich Gruppe von der ersten Ebene des Index:

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

Antwort

2

Option 1
könnten Sie verwenden eine Liste comp und 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 

Da die Kompilierung der Liste einen unnötigen Overhead darstellt, könnten Sie itertools.takewhile verwenden, um dies zu verhindern.

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 

Option 2
Eine andere mögliche Lösung, die ich ist Vorfilterung Ihre df einfiel Reihen zu halten, nur für die ersten zwei Werte des Index-Level 0 und dann die groupby tun.

# 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

Ihr Verständnis vollständig abgeschlossen ist. Ich frage mich, ob es einen Weg gibt, es früh zu brechen. – piRSquared

+0

@piRSquared Nur eine Option 2. –

1

Sieht hacky, aber das ist, was ich

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


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

Sicher, aber sauberer als die Liste comp! –

Verwandte Themen