2013-02-19 13 views
6

Supponiamo che df sia un dataframe pandas. Voglio dividerlo in due dataframes secondo alcuni criteri. Il modo migliore che ho trovato per fare questo è qualcosa di simile aCome dividere un dataframe in base a un criterio booleano?

df0, df1 = [v for _, v in df.groupby(df['class'] != 'special')] 

Nell'esempio precedente, il criterio è l'argomento al metodo groupby. Il df0 risultante è costituito dal sub-dataframe in cui il campo classha il valore'special' e df1 è fondamentalmente il complemento di df0. (Purtroppo, con questo costrutto, il sub-dataframe costituito dagli elementi che sicuro criterio vengono restituiti primo, che non è intuitivo.)

che questo costrutto presenta l'inconveniente di non essere particolarmente leggibile, non certo più leggibili, per esempio, un ipotetico splitby metodo come

df0, df1 = df.splitby(df['class'] == 'special') 

Poiché la suddivisione di un dataframe come questo è qualcosa che ho spesso bisogno di fare, immagino che ci possa essere una funzione built-in, o forse un idioma stabilita per averlo fatto Se è così, per favore fatemelo sapere.

risposta

6

Penso che il modo più leggibile è quello di fare questo è:

df0 = df[df.class != 'special'] 
df1 = df[df.class == 'special'] 

Non sono venuto attraverso un metodo speciale per questo ...

+3

potrei fare 'd = dict (list (df.groupby (df ["class"]! = "b"))) 'e quindi usa' d [0] '/' d [False] 'e' d [1] '/' d [True] 'invece. – DSM

+0

@DSM In effetti, groupby è probabilmente un modo ancora migliore per archiviarlo (!) –

+0

@AndyHayden: cosa intendi? Sarebbe bello se si potesse semplicemente indirizzare il contenuto di groupby con le sue (pseudo) chiavi, ma non funziona; cioè 'df.groupby (df.class! = 'b') [Vero]' genera un errore ... Non so come fare questo genere di cose senza convertire l'oggetto groupby in un dett ... – kjo

Problemi correlati