Używanie iloc do ustawiania wartości [zamknięte]

13

Ta linia zwraca pierwsze 4 wiersze w ramce danych combineddlafeature_a

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

Zgodnie z oczekiwaniami ten następny wiersz zwraca 2., 4. i 16. wiersz w ramce danych dla kolumny feature_a:

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

Linia ta wyznacza pierwsze 4 wiersze w dataframe do feature_acelu 77.

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

Ta linia coś robi. Działają pewne obliczenia, ponieważ ich zastosowanie do dłuższej listy trwa dłużej.

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

Wiersze 2, 4 i 16 nie są ustawione, 88gdy są zaznaczone:

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

Jak ustawić dowolną listę wierszy kolumny ramki danych na wartość bez konieczności masowego objazdu kodowania?

Wydaje się, że ten scenariusz powinien być prosty i powszechny.

Doug7
źródło
To pytanie dotyczy tylko programowania (bez statystyk) i dlatego należy do Stack Overflow
Jake Westfall
Bez minimalnego odtwarzalnego przykładu tego rodzaju pytanie byłoby również nie na temat w przypadku
przepełnienia stosu

Odpowiedzi:

24

Jeśli odwrócisz selektory i wybierzesz najpierw według kolumny, będzie działać dobrze:

Kod:

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

Dlaczego?

Kiedy zrobiłeś pierwszy (niedziałający sposób) wybierasz niesąsiadującą sekcję ramki danych. Powinieneś otrzymać ostrzeżenie:

Wartość próbuje zostać ustawiona na kopii wycinka z DataFrame. Spróbuj zamiast tego użyć .loc [wiersz_indexer, col_indexer] = wartość

Zobacz zastrzeżenia w dokumentacji: http://pandas.pydata.org/pandas- > docs / stable / indexing.html # indexing-view-versus-copy

Wynika to z faktu, że odbywają się dwie niezależne operacje.

  1. combined.iloc[[1,3,15]]tworzy nową ramkę danych złożoną tylko z trzech wierszy, a ramka jest koniecznie kopiowana. następnie...
  2. wybierz jedną kolumnę za pomocą, ["feature_a"]ale zostanie ona wybrana względem kopii.

Tak więc zadanie przechodzi do kopii. Istnieją różne sposoby rozwiązania tego problemu, ale w tym przypadku łatwiej (i taniej) jest najpierw wybrać kolumnę, a następnie wybrać części kolumn do przypisania.

Kod testowy:

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

Wyniki:

    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
źródło
1
To może działać, ale dlaczego?
Matthew Drury