Come impostare una cella su NaN in un dataframe panda


98

Vorrei sostituire i valori errati in una colonna di un dataframe con NaN.

mydata = {'x' : [10, 50, 18, 32, 47, 20], 'y' : ['12', '11', 'N/A', '13', '15', 'N/A']}
df = pd.DataFrame(mydata)

df[df.y == 'N/A']['y'] = np.nan

Tuttavia, l'ultima riga fallisce e lancia un avviso perché sta lavorando su una copia di df. Allora, qual è il modo corretto per gestirlo? Ho visto molte soluzioni con iloc o ix, ma qui devo usare una condizione booleana.


Mi sembra che il titolo sia fuorviante. Il problema non è che vuoi NaN nel tuo dataframe. Il problema è che stai "cercando di essere impostato su una copia di uno slice da un DataFrame".
Teepeemm,

Risposte:



13

Mentre l'utilizzo replacesembra risolvere il problema, vorrei proporre un'alternativa. Problema con la combinazione di valori numerici e alcuni valori stringa nella colonna per non sostituire le stringhe con np.nan, ma per rendere corretta l'intera colonna. Scommetto che la colonna originale molto probabilmente è di un tipo di oggetto

Name: y, dtype: object

Ciò di cui hai veramente bisogno è renderlo una colonna numerica (avrà un tipo corretto e sarebbe molto più veloce), con tutti i valori non numerici sostituiti da NaN.

Quindi, un buon codice di conversione sarebbe

pd.to_numeric(df['y'], errors='coerce')

Specificare errors='coerce'per forzare le stringhe che non possono essere analizzate su un valore numerico a diventare NaN. Il tipo di colonna sarebbe

Name: y, dtype: float64

10

Puoi usare sostituire:

df['y'] = df['y'].replace({'N/A': np.nan})

Anche essere consapevoli del inplaceparametro per replace. Puoi fare qualcosa come:

df.replace({'N/A': np.nan}, inplace=True)

Questo sostituirà tutte le istanze nel df senza creare una copia.

Allo stesso modo, se ti imbatti in altri tipi di valori sconosciuti come stringa vuota o valore Nessuno:

df['y'] = df['y'].replace({'': np.nan})

df['y'] = df['y'].replace({None: np.nan})

Riferimento: Pandas Latest - Replace


2

A partire da panda 1.0.0, non è più necessario utilizzare numpy per creare valori nulli nel dataframe. Invece puoi semplicemente usare pandas.NA (che è di tipo pandas._libs.missing.NAType), quindi verrà considerato nullo all'interno del dataframe ma non sarà nullo al di fuori del contesto del dataframe.


Sebbene questo non risolva il problema di OP, ho votato contro perché in realtà ha risposto alla domanda nel titolo.
Teepeemm,

1
df.loc[df.y == 'N/A',['y']] = np.nan

Questo risolve il tuo problema. Con il doppio [], stai lavorando su una copia del DataFrame. È necessario specificare la posizione esatta in una chiamata per poterla modificare.


0

Puoi provare questi frammenti.

In [16]: mydata = {'x': [10, 50, 18, 32, 47, 20], 'y': ['12', '11', 'N / A', '13', " 15 ',' N / A ']}
In [17]: df = pd.DataFrame (mydata)

In [18]: df.y [df.y == "N / A"] = np.nan

Fuori [19]: df 
    xy
0 10 12
1 50 11
2 18 NaN
3 32 13
4 47 15
5 20 NaN

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.