2013-10-25 14 views
22

Wie erhalten wir eine bestimmte gefilterte Reihe als Serie?Holen Sie sich bestimmte Reihe als Serie von Pandas Datenrahmen

Beispiel Datenrahmen:

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

ich brauche die Zeile auszuwählen, wo location ist cals eine Serie.

Ich habe versucht:

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

In beiden Fällen kann ich nicht die Zeile als Serie.

Antwort

36

Über die squeeze Funktion, die eine Dimension von der Datenrahmen entfernen wird:

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

DataFrame.squeeze Verfahren wirkt auf die gleiche Weise des Squeeze Argument der Funktion read_csv wenn auf Wahr gesetzt: wenn die resultierende Datenrahmen ist, ein 1-len Datenrahmen, dh es hat nur eine Dimension wie eine Spalte oder eine Zeile, dann wird das Objekt auf das kleinere Dimensionsobjekt gedrückt. In Ihrem Fall erhalten Sie ein Series-Objekt aus dem DataFrame. Dieselbe Logik gilt, wenn Sie ein Panel auf einen DataFrame drücken.

Squeeze ist explizit in Ihrem Code und zeigt deutlich Ihre Absicht, das Objekt in Händen "niederzuwerfen", weil seine Dimension auf eine kleinere projiziert werden kann.

Wenn der Datenrahmen mehr als eine Spalte oder Zeile enthält, hat Squeeze keine Auswirkung.

+0

Dank Boud, das wie ein Wunder wirkt. 'df [df [" location "] ==" c "]. squeeze()' funktioniert auch gut. Kannst du bitte auch erklären was für ein Quetschen das ist? "Squeeze length 1 dimensions" bedeutet, dass es 1 Reihe Ergebnisse in Serie umwandelt? – Pratyush

+0

@ Pratyush Ich aktualisierte die Antwort oben. Ich würde empfehlen, dass Sie Squeeze aufrufen, wenn Sie eine Serie von einem 1D-Datenframe erhalten möchten, was expliziter ist, als Iloc [0] nur für Cast-Zwecke aufzurufen. – Boud

+1

Weiß nicht, welcher ist besser, aber Squeeze wie Pythonic :) +1 für Erklärung –

9

Sie können direkt mit der ersten Reihe mit ganzzahligen Indizierung nehmen (iloc()-Funktion):

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

Danke Roman, das funktioniert auch ganz gut. – Pratyush

Verwandte Themen