2013-10-25 16 views
22

Come si ottiene una determinata riga filtrata come serie?Ottieni righe particolari come serie da dataframe panda

Esempio dataframe:

>>> df = pd.DataFrame({'date': [20130101, 20130101, 20130102], 'location': ['a', 'a', 'c']}) 
>>> df 
     date location 
0 20130101  a 
1 20130101  a 
2 20130102  c 

devo selezionare la riga dove è locationccome una serie.

Ho provato:

row = df[df["location"] == "c"].head(1) # gives a dataframe 
row = df.ix[df["location"] == "c"]  # also gives a dataframe with single row 

In entrambi i casi non posso la riga come serie.

risposta

36

Utilizzare la funzione squeeze che rimuove una dimensione dal dataframe:

df[df["location"] == "c"].squeeze() 
Out[5]: 
date  20130102 
location   c 
Name: 2, dtype: object 

metodo DataFrame.squeeze comporta allo stesso modo dell'argomento compressione della funzione read_csv se impostato su True: se il dataframe risultante è un dataframe da 1-len, ovvero ha una sola dimensione come se fosse una colonna o una riga, quindi l'oggetto viene schiacciato all'oggetto dimensione più piccolo. Nel tuo caso ottieni un oggetto Series da DataFrame. La stessa logica si applica se spremere un pannello in un DataFrame.

squeeze è esplicito nel codice e mostra chiaramente l'intenzione di "scartare" l'oggetto nelle mani perché la sua dimensione può essere proiettata su una più piccola.

Se il dataframe ha più di una colonna o riga, la spremitura non ha alcun effetto.

+0

Grazie Boud che funziona come un miracolo. 'df [df [" location "] ==" c "]. squeeze()' anche funziona bene. Puoi per favore spiegare anche cosa fa la compressione? "spremere lunghezza 1 dimensioni" significa che converte i risultati di 1 riga in serie? – Pratyush

+0

@Pratyush Ho aggiornato la risposta sopra. Ti consiglio di chiamare squeeze perché vuoi ottenere una serie da un frame di dati 1D, il che rende più esplicito che chiamare iloc [0] solo per scopi cast. – Boud

+1

Non so quale sia il migliore, ma stringi come pitonico :) +1 per spiegazione –

9

Si può solo prendere la prima fila con indicizzazione intero (iloc() funzione):

>>> df[df["location"] == "c"].iloc[0] 
date  20130102 
location   c 
Name: 2, dtype: object 
+0

Grazie Roman, anche questo funziona perfettamente. – Pratyush

Problemi correlati