J'utilise pandas et numpy.
Je souhaite supprimer toutes les colonnes de mon bloc de données d'entraînement 9000 x 13 où au moins 20% des entrées prennent la valeur -200. Dans ce cas, -200 est comme une valeur manquante ou NaN, donc je supprime les variables qui ne sont pas utiles. J'ai un échantillon des données ci-dessous. Toute aide serait appréciée.
C'est une sorte de tentative:
train_mod = train.loc [:, train.isnull (). mean () <.2>
A B C D E F \ 5723 0.5 846.25 -200 2.619270 627.50 79.0 4014 1.5 1016.25 -200 6.810175 848.50 99.0 4074 2.0 -200.00 -200 -200.000 -200.00 114.0 4577 1.6 950.50 -200 8.649763 925.50 351.0 6691 4.7 1469.75 -200 25.820425 1449.75 677.0 2889 0.5 902.50 -200 2.676091 631.25 -200.0 4387 2.0 1095.75 -200 12.972673 1082.75 310.0 4289 1.0 885.50 -200 2.695146 632.50 -200.0 2887 2.3 1355.00 -200 16.611225 1198.25 129.0 5694 1.1 936.25 -200 6.821513 849.00 127.0
3 Réponses :
val = -200 rows_20 = df.shape[0] // 5 train_mod = train[[c for c in train.columns if (train[c] == val).sum() <= rows_20]] Explanation:train[c] == val returns a Series of booleans (True/False). Calling .sum() on this counts the number of "True" values. This is then checked against row_20, which is 20% of the number of rows in the DataFrame.The list comprehension returns only columns that match the if condition.
Les réponses basées uniquement sur le code sont généralement mal vues sur ce site. Pourriez-vous s'il vous plaît modifier votre réponse pour inclure des commentaires ou une explication de votre code? Les explications doivent répondre à des questions telles que: Que fait-il? Comment ça marche? Où est-ce que ça va? Comment résout-il le problème d'OP? Voir: Comment répondre . Merci!
@EduardoBaitello assez juste, bien que ce lien ne mentionne rien sur le code seulement les réponses
Vous pouvez essayer de créer une nouvelle "tagging_column" en utilisant numpy.where () . Utilisez-le ensuite pour créer une colonne de comptage dans groupby puis agréger sur le comptage. Puis enfin calculer le ratio. Si le ratio est > = 20% Supprimez tous les tags à moins 200 ou une valeur inférieure .
Considérez:
>>> del df['Check Negative 200'] >>> del df['Count'] >>> df.reset_index(inplace = True, drop = True) >>> df id val 0 1 100 1 2 200 2 4 2000 3 5 20312039 4 6 12485
Vous pouvez également supprimer les colonnes ajoutées afin que vos colonnes restent les mêmes que l'entrée.
>>> df = pd.DataFrame({'id':[1,2,3,4,5,6,7,8,9], 'val':[100,200,-250,2000,20312039,12485,-300,-350,-60494]})
>>> df
id val
0 1 100
1 2 200
2 3 -250
3 4 2000
4 5 20312039
5 6 12485
6 7 -300
7 8 -350
8 9 -60494
>>> df['Check Negative 200'] = np.where(df['val'] <=-200, ['Negative 200 or lower'], ['Greater than -200'])
>>> df
id val Check Negative 200 Count
0 1 100 Greater than -200 5
1 2 200 Greater than -200 5
2 3 -250 Negative 200 or lower 4
3 4 2000 Greater than -200 5
4 5 20312039 Greater than -200 5
5 6 12485 Greater than -200 5
6 7 -300 Negative 200 or lower 4
7 8 -350 Negative 200 or lower 4
8 9 -60494 Negative 200 or lower 4
>>> df['Count'] = df.groupby('Check Negative 200')['Check Negative 200'].transform('count')
>>> df
id val Check Negative 200 Count
0 1 100 Greater than -200 5
1 2 200 Greater than -200 5
2 3 -250 Negative 200 or lower 4
3 4 2000 Greater than -200 5
4 5 20312039 Greater than -200 5
5 6 12485 Greater than -200 5
6 7 -300 Negative 200 or lower 4
7 8 -350 Negative 200 or lower 4
8 9 -60494 Negative 200 or lower 4
>>> dd = dict(df['Check Negative 200'].value_counts())
>>> dd
{'Greater than -200': 5, 'Negative 200 or lower': 4}
if dd['Negative 200 or lower']/len(df) > .2:
df = df[df['Check Negative 200'].isin(['Greater than -200'])]
else:
pass
>>> df
id val Check Negative 200 Count
0 1 100 Greater than -200 5
1 2 200 Greater than -200 5
3 4 2000 Greater than -200 5
4 5 20312039 Greater than -200 5
5 6 12485 Greater than -200 5
Ceci est une ligne un peu compliquée qui devrait faire l'affaire:
df_mod = df[df.columns[(df == -200).sum()/df.shape[0] < 0.2]]
Essentiellement, en allant de l'intérieur vers l'extérieur, nous voyons combien de valeurs dans chaque colonne sont invalides ( df == -200 ). La somme sur cette parenthèse additionne les valeurs booléennes, donc elle compte les entrées True . Nous divisons cela par le nombre de lignes, et là où cette valeur est inférieure à 20%, les colonnes sont conservées. Nous prenons ensuite le DataFrame où les colonnes remplissent cette condition, et se retrouvent avec les colonnes où moins de 20% des entrées ne sont pas valides.
J'espère que cela vous aidera!
pourquoi tu veux faire ça. Voulez-vous réduire la taille de la mémoire?
Copie possible de Comment supprimer une colonne dans le cadre de données pandas en fonction d'une condition?