2013-07-03 15 views
6

In panda come faccio a dividere Serie/dataframe in due Serie/DataFrames in cui righe dispari in una Serie, anche righe in differenti? In questo momento sto usandosplit data frame basato sull'indice intero

rng = range(0, n, 2) 
odd_rows = df.iloc[rng] 

Questo è piuttosto lento.

risposta

13

Uso fetta:

In [11]: s = pd.Series([1,2,3,4]) 

In [12]: s.iloc[::2] # even 
Out[12]: 
0 1 
2 3 
dtype: int64 

In [13]: s.iloc[1::2] # odd 
Out[13]: 
1 2 
3 4 
dtype: int64 
3

Ecco alcune comparazioni

In [100]: df = DataFrame(randn(100000,10)) 

metodo semplice (ma credo gamma rende questa lenta), ma lavorerò indipendentemente l'indice (ad esempio, non deve essere un indice numerico)

In [96]: %timeit df.iloc[range(0,len(df),2)] 
10 loops, best of 3: 21.2 ms per loop 

I seguenti richiedono uno Int64Index basato su intervallo (che è facile da ottenere, solo reset_index()).

In [107]: %timeit df.iloc[(df.index % 2).astype(bool)] 
100 loops, best of 3: 5.67 ms per loop 

In [108]: %timeit df.loc[(df.index % 2).astype(bool)] 
100 loops, best of 3: 5.48 ms per loop 

assicurarsi di dare posizioni dell'indice

In [98]: %timeit df.take(df.index % 2) 
100 loops, best of 3: 3.06 ms per loop 

Come sopra ma senza conversioni su indicies negativi

In [99]: %timeit df.take(df.index % 2,convert=False) 
100 loops, best of 3: 2.44 ms per loop 

Questo vincitore è @AndyHayden soln; funziona solo su un singolo dtype

In [118]: %timeit DataFrame(df.values[::2],index=df.index[::2]) 
10000 loops, best of 3: 63.5 us per loop 
Problemi correlati