Je teste les performances d'un algorithme d'apprentissage automatique, en particulier la manière dont il gère les données manquantes et le type de dégradation des performances lorsque des variables sont manquantes.
Par exemple, lorsque 20% de la variable x manque la précision de la le modèle diminue d'un certain%. Pour ce faire, j'aimerais simuler les données manquantes en remplaçant 20% des lignes d'une colonne de dataframe.
Existe-t-il un moyen de le faire?
démarrage de df :
df
var1 var2
0 nan 5
1 2 6
2 nan 7
3 4 8
résultat final: déposer 50% de la colonne 'var1' au hasard
d = {'var1': [1, 2, 3, 4], 'var2': [5, 6, 7, 8]}
df = pd.DataFrame(data=d)
df
var1 var2
0 1 5
1 2 6
2 3 7
3 4 8
3 Réponses :
https://chartio.com/resources/tutorials/how-to-check-if-any-value-is-nan-in-a-pandas-dataframe/
passez à "Compter les valeurs manquantes dans DataFrame"
df.isnull (). sum (). sum ()
Cette réponse ne répond pas à ce que la question pose réellement. Nous remplaçons les valeurs aléatoires NaN , sans les additionner toutes.
(Remarque: j'ai créé ceci avant de publier votre mcve. Je peux le modifier pour inclure votre code de départ.)
Voici une solution:
x 0 0.426642 1 NaN 2 NaN 3 0.869367 4 0.719778 5 NaN 6 0.944411 7 0.424733 8 0.246545 9 0.344444 10 0.810131 11 0.735028 12 NaN 13 0.707681 14 0.963711 15 0.420725 16 0.787127 17 0.618693 18 0.606222 19 0.022355
Sortie :
import pandas as pd
import numpy as np
df = pd.DataFrame({'x': np.random.random(20)})
length = len(df)
num = int(0.2*length)
idx_replace = np.random.randint(0, length-1, num)
df.loc[idx_replace, 'x'] = np.nan
print(df)
Réaffecter à l'aide de l ' exemple / code> , et les pandas introduiront des valeurs NaN en raison de l'alignement automatique:
In [1]: import pandas as pd
...: d = {'var1': [1, 2, 3, 4], 'var2': [5, 6, 7, 8]}
...: df = pd.DataFrame(data=d)
...: df
...:
Out[1]:
var1 var2
0 1 5
1 2 6
2 3 7
3 4 8
In [2]: df['var1'] = df['var1'].sample(frac=0.5)
In [3]: df
Out[3]:
var1 var2
0 1.0 5
1 NaN 6
2 3.0 7
3 NaN 8
De manière interactive:
df['var1'] = df['var1'].sample(frac=0.5)
veuillez fournir un mcve