web-dev-qa-db-fra.com

Comment mettre en minuscule une colonne de chaîne de données python si elle a des valeurs manquantes?

Le code suivant ne fonctionne pas. 

import pandas as pd
import numpy as np
df=pd.DataFrame(['ONE','Two', np.nan],columns=['x']) 
xLower = df["x"].map(lambda x: x.lower())

Comment devrais-je le modifier pour obtenir xLower = ['un', 'deux', np.nan]? L'efficacité est importante car le cadre de données réel est énorme.

36
P.Escondido

utilisez des pandas méthodes de chaîne vectorisées ; comme dans la documentation:

ces méthodes excluent automatiquement les valeurs manquantes/NA

.str.lower() en est le tout premier exemple;

>>> df['x'].str.lower()
0    one
1    two
2    NaN
Name: x, dtype: object
89
behzad.nouri

Une autre solution possible, dans le cas où la colonne contient non seulement des chaînes, mais aussi des nombres, consiste à utiliser astype(str).str.lower() car sinon, étant donné qu'un nombre n'est pas une chaîne, une fois abaissé, il retournera NaN.

import pandas as pd
import numpy as np
df=pd.DataFrame(['ONE','Two', np.nan,2],columns=['x']) 
xSecureLower = df['x'].astype(str).str.lower()
xLower = df['x'].str.lower()

ensuite nous avons:

>>> xSecureLower
0    one
1    two
2    NaN
3      2
Name: x, dtype: object

et pas

>>> xLower
0    one
1    two
2    NaN
3    NaN
Name: x, dtype: object
10
Mike Woodcock

Une solution possible:

import pandas as pd
import numpy as np
df=pd.DataFrame(['ONE','Two', np.nan],columns=['x']) 
xLower = df["x"].map(lambda x: x if type(x)!=str else x.lower())
print xLower

Et un résultat:

$ print example.py
0    one
1    two
2    NaN
Name: x, dtype: object

Pas sûr de l'efficacité si. 

4
Wojciech Walczak

vous pouvez aussi essayer celui-ci,

df= df.applymap(lambda s:s.lower() if type(s) == str else s)
1
Farid

copiez votre colonne Dataframe et appliquez simplement

df = données ['x'] newdf = df.str.lower ()

0
Ch HaXam