2014-05-01 10 views
5

Quando ho un dataframePandas con ordine tenuta uscita di lista di input

df = DataFrame({'A': [5, 6, 3, 4], 'B': [1, 2, 3, 5]}) 
df 

    A B 
0 5 1 
1 6 2 
2 3 3 
3 4 5 

posso utilizzare

df[df['A'].isin([3, 6])] 

per selezionare le righe aventi valori passati.

C'è anche un modo per mantenere l'ordine della lista di input?

sì che 'uscita non è:

A B 
1 6 2 
2 3 3 

ma

A B 
1 3 3 
2 6 2 
+2

Facendo 'df [...]' con indicizzazione booleano mantiene l'ordine di DataFrame, indipendentemente dal fatto che la parte '...' coinvolga 'isin' o no. Dovresti riordinare il tuo DataFrame separatamente, prima o dopo aver applicato 'isin'. – BrenBarn

+0

ok, non c'è un modo per riordinare l'output usando l'elenco di input come regola? – Nikita

+0

No, perché 'isin' serve solo per verificare se ciascun elemento alla volta" è inserito "nell'elenco, non * dove * è presente nell'elenco. Non presta attenzione all'ordine della lista. Come ho detto, avresti bisogno di fare l'ordine in un passaggio separato. – BrenBarn

risposta

1

isin è un'operazione di impostazione, e panda allinea l'ingresso, per cui l'ordine del set di ingresso è normalmente nello stesso ordine come il quadro di riferimento

Si potrebbe voler REALMENTE farlo:

In [15]: df.take(df['A'][df['A'].isin([3,6])].order().index) 
Out[15]: 
    A B 
2 3 3 
1 6 2 

[2 rows x 2 columns] 
+0

Ho finito per usare [x per (y, x) in ordine (zip (questo, lista (df.B [df.A.isin ([3,6])])))] mi dà il risultato desiderato . Purtroppo non sono riuscito a ottenere lo stesso dalla tua soluzione. – Nikita

+0

La soluzione di Nikita non funziona con NameError: nome 'this' non è definito Ho trovato che la soluzione di Jeff funziona per l'esempio df, ma non per un df più lungo. –

2

Questo è un po 'lungo, ma funziona. isin(), quindi sort_values ​​() in base alla lista.

df = pandas.DataFrame({'A' : [5,6,3,4], 'B' : [1,2,3,5]}) 
mylist = [3,6] 
ndf = df[df['A'].isin(mylist)] 
ndf['sort_cat'] = pandas.Categorical(ndf['A'], categories=mylist, ordered=True) 
ndf.sort_values('sort_cat', inplace=True) 
ndf.reset_index(inplace=True) 
print ndf 
    A B sort_cat 
2 3 3  3 
1 6 2  6 

(mi sono basato su questa risposta sort pandas dataframe based on list)

0

Un'altra opzione che filtra e generi in un solo colpo

import pandas as pd 
from functools import reduce 
reduce(pd.DataFrame.append, map(lambda i: df[df.A == i], [3, 6])) 
Problemi correlati