Comment minuscule pandas dataframe chaîne de colonne 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 dois-je modifier pour obtenir xLower = ['un','deux',np.nan] ?
L'efficacité est importante puisque la véritable trame de données est énorme.
- À partir de v0.25 ans, je recommande
str.casefold
pour plus agressif cas de pliage des comparaisons de chaînes. Plus d'informations dans cette réponse.
Vous devez vous connecter pour publier un commentaire.
utiliser les pandas vectorisé méthodes string; comme dans la documentation:
.str.lower()
est le premier exemple;10000 loops, best of 3: 96.4 µs per loop
contre10000 loops, best of 3: 125 µs per loop
Une autre solution possible, dans le cas où la colonne n'a pas seulement des chaînes de caractères, mais les numéros de trop, est d'utiliser
astype(str).str.lower()
outo_string(na_rep='')
parce que sinon, étant donné qu'un certain nombre n'est pas une chaîne, une fois réduits, il sera de retourNaN
, donc:puis nous avons:
et pas
edit:
si vous ne voulez pas perdre les NaNs, puis à l'aide de la carte sera mieux, (à partir de @wojciech-walczak, et @cs95 commentaire) il ressemblera à quelque chose comme ceci
Une solution possible:
Et un résultat:
Pas sûr de l'efficacité de la si.
isinstance
lors de la vérification du type d'un objet.Pandas >= 0.25: Supprimer le Cas des Distinctions avec
str.casefold
À partir de v0.25, je recommande l'utilisation de "vectorisé" méthode de chaîne
str.casefold
si vous travaillez avec des données unicode (il fonctionne indépendamment de la chaîne ou unicodes):Également voir GitHub question GH25405.
casefold
se prête à la plus agressive cas de pliage de comparaison. Elle s'occupe également de NaNs gracieusement (tout commestr.lower
n').Mais pourquoi est-ce mieux?
La différence est vu avec unicodes. En prenant l'exemple de la python
str.casefold
docs,Comparer la sortie de
lower
pour,Contre
casefold
,Voir aussi Python: lower() vs casefold() en correspondance de chaîne et de la conversion en minuscules.
vous pouvez essayer celui-ci aussi,
type(s) == str
devrait plutôt êtreisinstance(s, str)
Peut-être l'aide de la Liste de compréhension
copie de votre Dataframe de la colonne et il suffit d'appliquer