Utilizzo di iloc per impostare i valori [chiuso]


13

Questa riga restituisce le prime 4 righe nel dataframe combinedperfeature_a

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

Come previsto, questa riga successiva restituisce le righe 2, 4 e 16 nel frame di dati per la colonna feature_a:

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

Questa riga imposta le prime 4 righe nel dataframe per feature_aa 77.

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

Questa linea fa qualcosa. Si sta verificando una sorta di calcoli poiché impiega più tempo se applicato a un elenco più lungo.

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

Le righe 2a, 4a e 16a non sono impostate su 88se selezionate con questo:

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

Come posso impostare un elenco arbitrario di righe di una colonna di un frame di dati su un valore senza fare una deviazione di codifica massiccia?

Questo scenario sembra che dovrebbe essere piuttosto semplice e comune.


Questa è una domanda sulla sola programmazione (nessuna statistica) e quindi appartiene a Stack Overflow
Jake Westfall,

Senza un minimo esempio riproducibile questo tipo di domanda sarebbe fuori tema anche su StackOverflow
Glen_b -Reinstate Monica

Risposte:


24

Se inverti i selettori e selezioni prima per colonna, funzionerà bene:

Codice:

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

Perché?

Quando hai fatto il primo (non funzionante) stai selezionando una sezione non contigua del frame di dati. Dovresti aver ricevuto l'avviso:

Un valore sta tentando di essere impostato su una copia di una sezione da un DataFrame. Prova invece a utilizzare .loc [row_indexer, col_indexer] = value

Vedi le avvertenze nella documentazione: http://pandas.pydata.org/pandas- > docs / stable / indexing.html # indexing-view-versus-copy

Questo perché ci sono due operazioni indipendenti in corso.

  1. combined.iloc[[1,3,15]]crea un nuovo frame di dati di sole tre righe e il frame viene necessariamente copiato. poi...
  2. selezionare una colonna tramite ["feature_a"]ma è selezionata rispetto alla copia.

Quindi il compito va alla copia. Esistono vari modi per risolvere questo problema, ma in questo caso è più semplice (ed economico) selezionare prima la colonna, quindi selezionare parti delle colonne da assegnare.

Codice test:

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

risultati:

    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

1
Questo potrebbe funzionare, ma perché?
Matthew Drury,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.