1
votes

Comment puis-je supprimer des fonctionnalités / colonnes d'un bloc de données si au moins 20% de leurs entrées prennent une valeur spécifique, en utilisant pandas / numpy?

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   


2 commentaires

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?


3 Réponses :


0
votes
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.

2 commentaires

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



0
votes

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


0 commentaires

0
votes

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!


0 commentaires