J'ai plusieurs colonnes avec '%' et '>' et je veux m'en débarrasser et transformer les colonnes en nombres. Voici à quoi cela ressemble:

+----+-------------+--------+
|    | xRelegation | xChamp |
+----+-------------+--------+
| 11 | 12%         | <1%    |
| 12 | 20%         | <1%    |
| 13 | 27%         | <1%    |
| 14 | 85%         | <1%    |
| 15 | 91%         | <1%    |
+----+-------------+--------+

J'ai donc essayé de construire cette fonction pour pouvoir l'utiliser sur toutes les colonnes qui ont ces caractères:

def get_prob(row):
    for i in df[row]:
        prob = 0
        i = i.replace('%','')
        if i == '<1':
            prob = 0.001
        elif i == '>99':
            prob = 99.99
        else:
            prob = pd.to_numeric(i)/100
    return prob

Cependant, j'ai essayé de calculer cela:

df.apply(get_prob("xChamp"), axis=1)

Cela n'a pas fonctionné.

1
wazo 23 mai 2018 à 03:50

3 réponses

Meilleure réponse

Je pense que votre fonction get_prob n'a pas besoin d'une boucle pour, plus comme:

def get_prob(row):
    if row == '<1%':
        return 0.001
    elif row == '>99%':
        return 99.99
    else:
        return pd.to_numeric(row.replace('%',''))/100

Ensuite, si vous souhaitez modifier votre colonne, vous utilisez apply comme:

df['xRelegation'] = df['xRelegation'].apply(get_prob)

Et pareil pour l'autre colonne.

1
Ben.T 23 mai 2018 à 01:05

Vous n'avez pas besoin de boucler. Pour df comme ci-dessous:

  xChamp    xRelegation
0   <1%       12%
1   <1%       20%

Le code utilisant regex, vous pouvez supprimer les caractères que vous souhaitez supprimer de df,

import re
df = df.applymap(lambda x: re.sub('[<%$]', '', x)).astype(float)/100
df['xChamp'] = df['xChamp'].replace(dict(zip([0.01, 0.99],[0.001, 99.99])))
print(df)

Donne:

    xChamp  xRelegation
0   0.001   0.12
1   0.001   0.20
2   99.99   0.20

Pour plus d'informations, consultez les docs. .

0
harvpan 23 mai 2018 à 02:02

Utilisez df.replace ():

df.replace({'%':'','\<1':'0.001','\>99':'99.99'}, regex=True).astype(float)/100
0
jxc 23 mai 2018 à 01:09