2
votes

Je n'arrive pas à supprimer les nombres d'une chaîne

J'ai un bloc de données qui ressemble à ceci.

s = '83jjdmi239450  19dkd'
s = re.sub("\D", "", s)

J'essaie de me débarrasser de la chaîne " inf ". Fondamentalement, je veux simplement supprimer toutes les chaînes et ne conserver que les nombres dans le dataframe.

J'ai essayé le code suivant ci-dessous.

TypeError: expected string or bytes-like object

Lorsque j'exécute l'une de ces lignes de code, j'obtiens l'erreur suivante.

kepler = re.sub("\D", "", kepler)
kepler = re.sub('[^0-9]','0', kepler)

Si j'ai une chaîne très simple, cela fonctionne réellement. Donc, cela fonctionnera.

0                                             1.144921                     
1                                             1.000000                     
2                                             1.119507                     
3                                                  inf                     
4                                             0.000000                     
5                                                  inf                     
6                                             0.000000                     
7                                             0.000000                     
8                                             1.000000                     
9                                             0.000000                     
10                                            0.000000                     
11                                            0.000000                     
12                                            1.793687                     
13                                                 inf    

Malheureusement, le code ne fonctionne pas sur mon dataframe. Des pensées? Merci.


5 commentaires

Utilisez-vous des pandas ici?


Essayez kepler = re.sub ("\ D", "", kepler) si type (kepler) == 'str' else kepler


Oui, je lis des données à partir d'un fichier CSV. kepler = pd.read_csv (fichier)


cherchez-vous df [df [0] .apply (lambda x: type (x)! = str)]


Est-ce que cela répond à votre question? supprimer des valeurs infinies de dataframes chez les pandas?


3 Réponses :


2
votes

Avec numpy.isfinite routine sur exemple de dataframe:

In [176]: df
Out[176]: 
           a
0   1.000000
1   1.119507
2        inf
3   0.000000
4        inf
5   0.000000
6   0.000000
7   1.000000
8   0.000000
9   0.000000
10  0.000000
11  1.793687
12       inf

In [177]: df = df[~np.isinf(df['a'])]

In [178]: df
Out[178]: 
           a
0   1.000000
1   1.119507
3   0.000000
5   0.000000
6   0.000000
7   1.000000
8   0.000000
9   0.000000
10  0.000000
11  1.793687


0 commentaires

1
votes

Essayez

df = pd.read_clipboard()
df.columns = ['col1','col2']
df

    col1    col2
0   1   1.000000
1   2   1.119507
2   3   inf
3   4   0.000000
4   5   inf
5   6   0.000000
6   7   0.000000
7   8   1.000000
8   9   0.000000
9   10  0.000000
10  11  0.000000
11  12  1.793687
12  13  inf

df.col2[df.col2 < np.inf]
0     1.000000
1     1.119507
3     0.000000
5     0.000000
6     0.000000
7     1.000000
8     0.000000
9     0.000000
10    0.000000
11    1.793687


0 commentaires

1
votes

J'essaye de me débarrasser de la chaîne "inf".

Vous le décrivez comme une chaîne, mais ce n'est que la représentation imprimée d'un nombre à virgule flottante 64 bits.

TypeError: chaîne attendue ou objet de type octets

Vous ne pouvez pas transférer un flottant dans une opération regex, car une regex a besoin d'une chaîne.

Au lieu de cela, transformez les quantités infinies en NaN s, et déposez-les:

rows = [dict(x=1.79),
        dict(x=math.inf)]
df = pd.DataFrame(rows).replace([np.inf, -np.inf], np.nan)
df = df.dropna()

1 commentaires

D'accord. Ça marche. Merci tout le monde.