Verwenden von iloc zum Festlegen von Werten [closed]

13

Diese Zeile gibt die ersten 4 Zeilen im Datenrahmen combinedfür zurückfeature_a

combined.iloc[0:4]["feature_a"]

Wie erwartet gibt diese nächste Zeile die 2., 4. und 16. Zeile im Datenrahmen für die Spalte zurück feature_a:

combined.iloc[[1,3,15]]["feature_a"]

Diese Zeile setzt die ersten 4 Zeilen des Datenrahmens feature_aauf 77.

combined.iloc[0:4]["feature_a"] = 77

Diese Zeile macht etwas. Es werden einige Berechnungen durchgeführt, da die Anwendung auf eine längere Liste länger dauert.

combined.iloc[[1,3,15]]["feature_a"] = 88

Die 2., 4. und 16. Zeile sind nicht gesetzt, 88wenn dies markiert ist:

combined.iloc[[1,3,15]]["feature_a"]

Wie kann ich eine beliebige Liste von Zeilen einer Spalte eines Datenrahmens auf einen Wert setzen, ohne einen massiven Umweg über die Codierung zu machen?

Dieses Szenario scheint ziemlich einfach und üblich zu sein.

Doug7
quelle
Dies ist nur eine Frage zur Programmierung (keine Statistik) und gehört somit zu Stack Overflow
Jake Westfall
Ohne ein minimal reproduzierbares Beispiel wäre diese Art von Frage auch beim
Stackoverflow nicht aktuell

Antworten:

24

Wenn Sie die Selektoren umkehren und zuerst nach Spalte auswählen, funktioniert dies einwandfrei:

Code:

df.feature_a.iloc[[1, 3, 15]] = 88

Warum?

Wenn Sie die erste (nicht funktionierende) Methode ausgeführt haben, wählen Sie einen nicht zusammenhängenden Abschnitt des Datenrahmens aus. Sie sollten die Warnung erhalten haben:

Es wird versucht, einen Wert für eine Kopie eines Slice aus einem DataFrame festzulegen. Verwenden Sie stattdessen .loc [Zeilenindex, Spaltenindex] = value

Beachten Sie die Vorsichtsmaßnahmen in der Dokumentation: http://pandas.pydata.org/pandas- > docs / stable / indexing.html # indexing-view-versus-copy

Dies liegt daran, dass zwei unabhängige Operationen stattfinden.

  1. combined.iloc[[1,3,15]]Erstellt einen neuen Datenrahmen mit nur drei Zeilen, und der Rahmen muss kopiert werden. dann...
  2. Wählen Sie eine Spalte über aus, ["feature_a"]aber sie wird gegen die Kopie ausgewählt.

Die Zuordnung geht also zur Kopie. Es gibt verschiedene Möglichkeiten, dies zu beheben. In diesem Fall ist es jedoch einfacher (und kostengünstiger), zuerst die Spalte und dann Teile der Spalten für die Zuweisung auszuwählen.

Testcode:

df = pd.DataFrame(np.zeros((20, 3)), columns=['feature_a', 'b', 'c'])
df.feature_a.iloc[[1, 3, 15]] = 88
print(df)

Ergebnisse:

    feature_a    b    c
0         0.0  0.0  0.0
1        88.0  0.0  0.0
2         0.0  0.0  0.0
3        88.0  0.0  0.0
4         0.0  0.0  0.0
5         0.0  0.0  0.0
6         0.0  0.0  0.0
7         0.0  0.0  0.0
8         0.0  0.0  0.0
9         0.0  0.0  0.0
10        0.0  0.0  0.0
11        0.0  0.0  0.0
12        0.0  0.0  0.0
13        0.0  0.0  0.0
14        0.0  0.0  0.0
15       88.0  0.0  0.0
16        0.0  0.0  0.0
17        0.0  0.0  0.0
18        0.0  0.0  0.0
19        0.0  0.0  0.0
Stephen Rauch
quelle
1
Das mag funktionieren, aber warum?
Matthew Drury