2013-03-29 7 views
6

Ich habe diesen Datenrahmen in Pandas:Zeichenfolge aus Pandas Series und DataFrames in Python erhalten?

d=pandas.DataFrame([{"a": 1, "b": 1}, {"c": 2, "b": 4}]) 
d["name"] = ["Hello", "World"] 

Ich mag ein Element wählen, basierend auf seinem String-Wert in Spalte „Namen“ und dann den Wert als String erhalten. Um das Element zu wählen:

d[d["name"] == "World"]["name"] 
Out: 
1 World 
Name: name 

Das Problem ist, dass es nicht einen einfachen String nicht geben, sondern eine Serie. Casting zu einem String wird nicht helfen - wie kann ich nur die Zeichenfolge "World" daraus bekommen? Ist das der einzige Weg?

d[d["name"] == "World"]["name"].values[0] 

danke.

+2

Können Sie Ihr Beispiel etwas erweitern? Im Moment scheint es so, als würdest du "World" einsetzen und "World" als Output nutzen. – DSM

+0

@DSM: Ja, das ist richtig, aber stellen Sie sich vor, dass wir statt "name" einen anderen col-Namen genommen haben, wie: 'd [d [" name "] ==" Welt "] [" anderer_name "]' where ' other_name' ist eine String-Spalte – user248237dfsf

+2

Das wäre ein besseres Beispiel gewesen. : ^) Aber im allgemeinen Fall gibt es keine Garantie, dass es nur einen übereinstimmenden Wert gibt, oder? Ich vermute also, dass das Ergebnis im Wesentlichen Array-artig sein wird. Sie können die Syntax verkürzen - zum Beispiel mit "max" oder "iget" - aber davon bin ich mir nicht sicher. Vielleicht hat Hayden etwas schlaues .. – DSM

Antwort

7

Da @DSM darauf hinweist, könnte es im Allgemeinen viele Zeilen mit dem Namen 'World' geben, also müssen wir irgendwo einen aussuchen.

Eine Möglichkeit, dies zu tun, die where verwenden könnte ganz nett scheint (und dann max):

In [11]: d.name.where(d.name == 'World', np.nan) 
Out[11]: 
0  NaN 
1 World 
Name: name, dtype: object 

In [12]: d.name.where(d.name == 'World', np.nan).max() 
Out[12]: 'World' 

Hinweis: Wenn es keine Zeile mit dem Namen ‚Welt‘ ist dies NaN zurück.

+0

Ich habe mich in der Vergangenheit gefragt, ob es vielleicht sein sollte - oder vielleicht gibt es das und ich kenne die Syntax einfach nicht! - eine dict-ähnliche Filtermethode, so dass etwas wie d.ff ({"name": "Welt"}) ["c"] 'die passende Serie ergeben würde, ohne dass" .name "oder" "dupliziert werden muss "d". – DSM

+0

@DSM Ich denke nicht * es gibt (nur einen Blick, wird ein wenig mehr aussehen), aber ich stimme zu, dass wäre eine schöne Methode, vielleicht sollte auch Boolesche Funktionen auf Spalten nehmen ... Ich denke ich wird eins hinzufügen. :) –

7

gibt es eine Methode, die niemand erwähnt, dass vielleicht erwähnenswert sein. Das war ein Problem, das ich hatte, wo ich mehrere Kriterien-Checks machte und eine einzelne Item-Serie zurückbekam (im Grunde ein eindeutiges Zeilenergebnis). Wenn Sie ein einzelnes Element in einer Reihe und müssen nur das Element OR kennt den Index des jeweiligen Elements, das Sie sammeln möchten, tut gerade dies:

d[d["name"] == "World"].tolist()[0] 

zum ersten (und einzigen) Artikel in einem einzigen Artikel Serie.

Oder diese:

d[d["name"] == "World"].tolist()[index] 

wo index der Index des Elements ist, dass Sie in der Serie suchen.

Wenn Sie es als String möchten, müssen Sie unter Umständen als String werfen, wenn sie nicht bereits standardmäßig Zeichenfolge wird.

Verwandte Themen