Zum Beispiel habe ich einfache DF:
import pandas as pd
from random import randint
df = pd.DataFrame({'A': [randint(1, 9) for x in xrange(10)],
'B': [randint(1, 9)*10 for x in xrange(10)],
'C': [randint(1, 9)*100 for x in xrange(10)]})
Kann ich Werte aus 'A' auswählen, für die die entsprechenden Werte für 'B' größer als 50 sind, und für 'C' - ungleich 900 - unter Verwendung der Methoden und Redewendungen von Pandas?
df.query
undpd.eval
scheinen gut für diesen Anwendungsfall zu passen. Informationen zurpd.eval()
Funktionsfamilie, ihren Funktionen und Anwendungsfällen finden Sie unter Auswertung dynamischer Ausdrücke in Pandas mit pd.eval () .Antworten:
Sicher! Konfiguration:
Wir können Spaltenoperationen anwenden und boolesche Serienobjekte abrufen:
[Update, um zum neuen Stil zu wechseln
.loc
]:Und dann können wir diese verwenden, um in das Objekt zu indizieren. Für den Lesezugriff können Sie Indizes verketten:
Sie können jedoch aufgrund des Unterschieds zwischen einer Ansicht und einer Kopie, die dies für den Schreibzugriff tun, in Schwierigkeiten geraten. Sie können
.loc
stattdessen verwenden:Beachten Sie, dass ich versehentlich getippt habe
== 900
und nicht!= 900
oder~(df["C"] == 900)
, aber ich bin zu faul, um das Problem zu beheben. Übung für den Leser. : ^)quelle
.loc
Update - es wäre gut, wenn Sie klären würden, wo wir eine Kopie bekommen und wo eine Ansicht.{TypeError}cannot compare a dtyped [int64] array with a scalar of type [bool]
Eine andere Lösung besteht darin, die Abfragemethode zu verwenden:
Wenn Sie nun die zurückgegebenen Werte in Spalte A ändern möchten, können Sie deren Index speichern:
.... und verwenden
.iloc
, um sie zu ändern, dh:quelle
Und denken Sie daran, Klammern zu verwenden!
Beachten Sie, dass der
&
Operator Vorrang vor Operatoren wie>
oder<
usw. hat. Deshalbbewertet zu
False
. Wenn Sie also verwendenpd.loc
, müssen Sie Ihre logischen Anweisungen in Klammern setzen, da sonst eine Fehlermeldung angezeigt wird. Deshalb tun Sie:anstatt
was dazu führen würde
quelle
Sie können Pandas verwenden, für deren Vergleich einige Funktionen integriert sind. Wenn Sie also Werte von "A" auswählen möchten, die von den Bedingungen von "B" und "C" erfüllt werden (vorausgesetzt, Sie möchten ein DataFrame-Pandas-Objekt zurückgeben).
df[['A']][df.B.gt(50) & df.C.ne(900)]
df[['A']]
gibt Ihnen Spalte A im DataFrame-Format zurück.Die Funktion 'gt' von pandas gibt die Positionen von Spalte B zurück, die größer als 50 sind, und 'ne' gibt die Positionen ungleich 900 zurück.
quelle