Ich habe einen Pandas DataFrame erstellt
df = DataFrame(index=['A','B','C'], columns=['x','y'])
und habe das bekommen
xy Ein NaN NaN B NaN NaN C NaN NaN
Dann möchte ich einer bestimmten Zelle einen Wert zuweisen, zum Beispiel für Zeile 'C' und Spalte 'x'. Ich habe erwartet, ein solches Ergebnis zu erzielen:
xy Ein NaN NaN B NaN NaN C 10 NaN
mit diesem Code:
df.xs('C')['x'] = 10
aber der Inhalt von df
hat sich nicht geändert. Es ist wieder nur NaN
s in DataFrame.
Irgendwelche Vorschläge?
df['x']['C']
), sonderndf.ix['x','C']
.dataframe[column (series)] [row (Series index)]
Während viele Personen (einschließlich ich) eher an diedataframe[row][column]
Reihenfolge gewöhnt sind . Als Matlab- und R-Programmierer fühlt sich Letzteres für mich intuitiver an, aber anscheinend funktioniert Pandas nicht so.Antworten:
RukTech Antwort ,
df.set_value('C', 'x', 10)
ist bei weitem schneller als die Optionen , die ich unten vorgeschlagen habe. Es ist jedoch für die Abschreibung vorgesehen .In Zukunft ist die empfohlene Methode
.iat/.at
.Warum
df.xs('C')['x']=10
funktioniert das nicht:df.xs('C')
Gibt standardmäßig einen neuen Datenrahmen mit einer Kopie der Daten zurückÄndert nur diesen neuen Datenrahmen.
df['x']
gibt eine Ansicht des zurückdf
Gibt Datenrahmens zurückändert
df
sich.Warnung : Es ist manchmal schwierig vorherzusagen, ob ein Vorgang eine Kopie oder eine Ansicht zurückgibt. Aus diesem Grund ist die empfehlen Dokumente, Zuweisungen mit "verketteter Indizierung" zu vermeiden .
Die empfohlene Alternative ist also
das nicht ändern
df
.quelle
df.x
in der API . Was hast du gemeint?'x'
ist der Name einer Spalte indf
.df.x
Gibt aSeries
mit den Werten in der Spalte zurückx
. Ich werde es ändern,df['x']
da diese Notation mit jedem Spaltennamen funktioniert (im Gegensatz zur Punktnotation) und ich denke, ist klarer.df.x
sei eine unbekannte neue Methode nebendf.xs, df.ix
df.xs(..., copy=True)
gibt eine Kopie zurück, und das ist das Standardverhalten.df.xs(..., copy=False)
gibt das Original zurück.Update: Die
.set_value
Methode wird veraltet sein ..iat/.at
sind gute ersetzungen, leider liefert pandas wenig dokumentationDer schnellste Weg, dies zu tun, ist die Verwendung von set_value . Diese Methode ist ~ 100-mal schneller als die
.ix
Methode. Zum Beispiel:df.set_value('C', 'x', 10)
quelle
df['x']['C'] = 10
.df=df.append(df.sum(numeric_only=True),ignore_index=True)
?Sie können auch eine bedingte Suche verwenden, indem Sie Folgendes verwenden
.loc
:Wo
<some_column_name
ist die Spalte, mit der Sie die<condition>
Variable vergleichen möchten, und wo ist die Spalte, zu der<another_column_name>
Sie hinzufügen möchten (kann eine neue oder bereits vorhandene Spalte sein).<value_to_add>
ist der Wert, den Sie dieser Spalte / Zeile hinzufügen möchten.Dieses Beispiel funktioniert nicht genau mit der vorliegenden Frage, aber es kann nützlich sein, wenn jemand einen bestimmten Wert basierend auf einer Bedingung hinzufügen möchte.
quelle
df.loc[df['age']==3, ['age-group']] = 'toddler'
Die empfohlene Methode (laut den Betreuern) zum Festlegen eines Werts lautet:
Verwenden der verketteten Indizierung (
df['x']['C']
) kann zu Problemen führen.Sehen:
quelle
ix
ist veraltet: pandas-docs.github.io/pandas-docs-travis/…Versuchen Sie es mit
df.loc[row_index,col_indexer] = value
quelle
Dies ist das einzige, was für mich funktioniert hat!
Erfahren Sie mehr über
.loc
hier .quelle
.loc
ersetzen.iat/.at
?at
Ähnlich wieloc
bei beiden bieten sie markenbasierte Suchvorgänge. Verwendenat
Sie diese Option, wenn Sie nur einen einzelnen Wert in einem DataFrame oder einer Serie abrufen oder festlegen müssen. Von Padas Doc.iat/.at
ist die gute Lösung. Angenommen, Sie haben diesen einfachen Datenrahmen:Wenn wir den Wert der Zelle ändern möchten,
[0,"A"]
können Sie eine der folgenden Lösungen verwenden:df.iat[0,0] = 2
df.at[0,'A'] = 2
Und hier ist ein vollständiges Beispiel, wie Sie einen Zellwert
iat
abrufen und festlegen können:y_train vorher:
y_train nach dem Aufruf der Vorbesitzfunktion,
iat
die geändert werden muss, um den Wert jeder Zelle mit 2 zu multiplizieren:quelle
Verwenden Sie zum Festlegen von Werten:
set_value
,ix
Sind veraltet.iloc
undloc
quelle
Sie können verwenden
.iloc
.quelle
df.iloc[[2:8], [0]] = [2,3,4,5,6,7]
was die Methodedf.loc()
nativ tut.In meinem Beispiel ändere ich es einfach in der ausgewählten Zelle
'result' ist ein dataField mit der Spalte 'weight'
quelle
set_value()
ist veraltet.Ab der Veröffentlichung 0.23.4 kündigt Pandas " die Zukunft an " ...
In Anbetracht dieses Ratschlags finden Sie hier eine Demonstration ihrer Verwendung:
Verweise:
quelle
Hier ist eine Zusammenfassung der gültigen Lösungen, die von allen Benutzern für Datenrahmen bereitgestellt werden, die durch Ganzzahl und Zeichenfolge indiziert sind.
df.iloc, df.loc und df.at funktionieren für beide Arten von Datenrahmen, df.iloc funktioniert nur mit Zeilen- / Spalten-Ganzzahlindizes, df.loc und df.at unterstützen das Festlegen von Werten mithilfe von Spaltennamen und / oder Ganzzahlindizes .
Wenn der angegebene Index nicht vorhanden ist, würden sowohl df.loc als auch df.at die neu eingefügten Zeilen / Spalten an den vorhandenen Datenrahmen anhängen, aber df.iloc würde "IndexError: Positionsindexer sind außerhalb der Grenzen" auslösen. Ein in Python 2.7 und 3.7 getestetes Arbeitsbeispiel lautet wie folgt:
quelle
Ich habe getestet und die Ausgabe ist
df.set_value
etwas schneller, aber die offizielle Methodedf.at
scheint die schnellste nicht veraltete Methode zu sein.Beachten Sie, dass hiermit der Wert für eine einzelne Zelle festgelegt wird. Für die Vektoren
loc
undiloc
sollten bessere Optionen sein, da sie vektorisiert sind.quelle
Eine Möglichkeit, den Index mit Bedingung zu verwenden, besteht darin, zuerst den Index aller Zeilen abzurufen, die Ihre Bedingung erfüllen, und diese Zeilenindizes dann einfach auf verschiedene Arten zu verwenden
Beispielbedingung ist wie
Dann können Sie diese Zeilenindizes auf verschiedene Arten verwenden, wie z
Dies ist alles möglich, da .index ein Indexarray zurückgibt, das .loc für die direkte Adressierung verwenden kann, um das Durchlaufen immer wieder zu vermeiden.
quelle
df.loc['c','x']=10
Dies ändert den Wert der c- ten Zeile und der x- ten Spalte.quelle
Zusätzlich zu den obigen Antworten finden Sie hier einen Benchmark, in dem verschiedene Möglichkeiten zum Hinzufügen von Datenzeilen zu einem bereits vorhandenen Datenrahmen verglichen werden. Es zeigt, dass die Verwendung von at oder set-value der effizienteste Weg für große Datenrahmen ist (zumindest für diese Testbedingungen).
Für den Test wurde ein vorhandener Datenrahmen mit 100.000 Zeilen und 1.000 Spalten sowie zufälligen Zahlenwerten verwendet. Zu diesem Datenrahmen wurden 100 neue Zeilen hinzugefügt.
Code siehe unten:
quelle
Wenn Sie Werte nicht für die gesamte Zeile, sondern nur für einige Spalten ändern möchten:
quelle
Ab Version 0.21.1 können Sie auch die
.at
Methode verwenden. Es gibt einige Unterschiede zu den.loc
hier genannten - pandas .at versus .loc , aber beim Ersetzen einzelner Werte ist dies schnellerquelle
Also, Ihre Frage, NaN bei ['x', C] in den Wert 10 umzuwandeln
die Antwort ist..
alternativer Code ist
quelle
Auch ich habe nach diesem Thema gesucht und eine Möglichkeit zusammengestellt, einen DataFrame zu durchlaufen und ihn mit Suchwerten aus einem zweiten DataFrame zu aktualisieren. Hier ist mein Code.
quelle