English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Pandas example of data loss operation
In real life, data loss is always a problem. Fields such as machine learning and data mining face serious problems in the accuracy of model predictions because missing values lead to poor data quality. In these fields, handling missing values is a major focus to make models more accurate and effective.
Let's consider an online survey of a product. Many times, people do not share all the information related to them. Very few people share their experiences, but do not share how long they have used the product; very few people share how long they have used the product, their experiences rather than their contact information. Therefore, in some way or another, some data is always lost, which is very common in real-time situations.
Now let's see how to use pandas to handle missing values (such as NA or NaN).
#import the pandas library import pandas as pd, import numpy as np, df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f', 'h'], columns=['one', 'two', 'three']) df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']), print(df)
I risultati dell'esecuzione sono i seguenti:
uno due tre a -0.576991 -0.741695 0.553172 b NaN NaN NaN c 0.744328 -1.735166 1.749580 NaN sostituito con '0': uno due tre a -0.576991 -0.741695 0.553172 b 0.000000 0.000000 0.000000 c 0.744328 -1.735166 1.749580
Utilizzando il riindicizzamento, abbiamo creato un DataFrame con valori mancanti. Nei risultati, NaN rappresenta non un numero.
Per rendere più facile (e diverso) la detezione dei valori mancanti (e diversi array dtypes), pandas fornisce le funzioni ISNULL() e NOTNULL(), che sono anche metodi per gli oggetti serie e DataFrame -
import pandas as pd, import numpy as np, df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f', 'h'], columns=['one', 'two', 'three']) df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']), print(df['uno'].isnull())
I risultati dell'esecuzione sono i seguenti:
a False b True c False d True e False f False g True h False Nome: uno, dtype: bool
import pandas as pd, import numpy as np, df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f', 'h'], columns=['one', 'two', 'three']) df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']), print(df['uno'].notnull())
I risultati dell'esecuzione sono i seguenti:
a True b False c True d False e True f True g False h True Nome: uno, dtype: bool
Quando si sommano dati, i valori NA vengono considerati come zero Se i dati sono tutti inapplicabili, il risultato è inapplicabile
import pandas as pd, import numpy as np, df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f', 'h'], columns=['one', 'two', 'three']) df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']), print(df['uno'].sum())
I risultati dell'esecuzione sono i seguenti:
2.02357685917
import pandas as pd, import numpy as np, df = pd.DataFrame(index=[0,1,2,3,4,5],columns=['uno','due']) print(df['uno'].sum())
I risultati dell'esecuzione sono i seguenti:
nan
Pandas fornisce più metodi per eliminare valori mancanti. La funzione fillna può essere utilizzata per riempire i valori NA con dati non vuoti in vari modi.
Il seguente programma mostra come sostituire “ NaN” con “ 0”.
import pandas as pd, import numpy as np, df = pd.DataFrame(np.random.randn(3, 3), index=['a', 'c', 'e'],columns=['uno', ''due', 'tre']) df = df.reindex(['a', 'b', 'c'])) print(df) print(("NaN sostituito con '0':")) print(df.fillna(0))
I risultati dell'esecuzione sono i seguenti:
uno due tre a -0.576991 -0.741695 0.553172 b NaN NaN NaN c 0.744328 -1.735166 1.749580 NaN sostituito con '0': uno due tre a -0.576991 -0.741695 0.553172 b 0.000000 0.000000 0.000000 c 0.744328 -1.735166 1.749580
In questo caso, riempiamo con zero; al contrario, possiamo anche riempire con altri valori.
Utilizzando il concetto di riempimento discusso nel capitolo 'Riorganizzazione degli indici', riempiremo i valori mancanti.
Metodo | Operazione |
pad/fill | Riempimento in avanti < |
bfill/backfill | Riempimento in avanti |
import pandas as pd, import numpy as np, df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f', 'h'], columns=['one', 'two', 'three']) df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']), print(df.fillna(method='pad'))
I risultati dell'esecuzione sono i seguenti:
uno due tre a 0.077988 0.476149 0.965836 b 0.077988 0.476149 0.965836 c -0.390208 -0.551605 -2.301950 d -0.390208 -0.551605 -2.301950 e -2.000303 -0.788201 1.510072 f -0.930230 -0.670473 1.146615 g -0.930230 -0.670473 1.146615 h 0.085100 0.532791 0.887415
import pandas as pd, import numpy as np, df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f', 'h'], columns=['one', 'two', 'three']) df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']), print(df.fillna(method='backfill'))
I risultati dell'esecuzione sono i seguenti:
uno due tre a 0.077988 0.476149 0.965836 b -0.390208 -0.551605 -2.301950 c -0.390208 -0.551605 -2.301950 d -2.000303 -0.788201 1.510072 e -2.000303 -0.788201 1.510072 f -0.930230 -0.670473 1.146615 g 0.085100 0.532791 0.887415 h 0.085100 0.532791 0.887415
Se si desidera escludere solo i valori mancanti, utilizzare la funzione dropna insieme al parametro axis. Di default, axis = 0, ovvero lungo le righe, il che significa che se qualsiasi valore in una riga è NA, l'intera riga verrà esclusa.
import pandas as pd, import numpy as np, df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f', 'h'], columns=['one', 'two', 'three']) df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']), print(df.dropna())
I risultati dell'esecuzione sono i seguenti:
uno due tre a 0.077988 0.476149 0.965836 c -0.390208 -0.551605 -2.301950 e -2.000303 -0.788201 1.510072 f -0.930230 -0.670473 1.146615 h 0.085100 0.532791 0.887415
import pandas as pd, import numpy as np, df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f', 'h'], columns=['one', 'two', 'three']) df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']), print(df.dropna(axis=1)),
I risultati dell'esecuzione sono i seguenti:
DataFrame vuoto Colonne: [] Indice: [a, b, c, d, e, f, g, h]
Spesso, dobbiamo sostituire un valore universale con un valore specifico. Possiamo farlo applicando il metodo replace().
Sostituire NA con un valore scalare è un comportamento equivalente alla funzione fillna().
import pandas as pd, import numpy as np, df = pd.DataFrame({'one':[10,20,30,40,50,2000], 'two':[1000,0,30,40,50,60]}), print(df.replace({1000:10,2000:60})),
I risultati dell'esecuzione sono i seguenti:
uno due 0 10 10 1 20 0 2 30 30 3 40 40 4 50 50 5 60 60
import pandas as pd, import numpy as np, df = pd.DataFrame({'one':[10,20,30,40,50,2000], 'two':[1000,0,30,40,50,60]}), print(df.replace({1000:10,2000:60})),
I risultati dell'esecuzione sono i seguenti:
uno due 0 10 10 1 20 0 2 30 30 3 40 40 4 50 50 5 60 60