Je veux trouver toutes les valeurs dans un dataframe Pandas qui contiennent des espaces (n'importe quel montant arbitraire) et remplacer ces valeurs par NaNs.
Des idées sur la façon dont cela peut être amélioré?
Fondamentalement, je veux tourner ceci:
A B C
2000-01-01 -0.532681 foo 0
2000-01-02 1.490752 bar 1
2000-01-03 -1.387326 foo 2
2000-01-04 0.814772 baz
2000-01-05 -0.222552 4
2000-01-06 -1.176781 qux
Dans ceci:
A B C
2000-01-01 -0.532681 foo 0
2000-01-02 1.490752 bar 1
2000-01-03 -1.387326 foo 2
2000-01-04 0.814772 baz NaN
2000-01-05 -0.222552 NaN 4
2000-01-06 -1.176781 qux NaN
J'ai réussi à le faire avec le code ci-dessous, mais c'est moche. Ce n'est pas Pythonic et je suis sûr que ce n'est pas non plus l'utilisation la plus efficace des pandas. Je boucle sur chaque colonne et effectue un remplacement booléen par rapport à un masque de colonne généré en appliquant une fonction qui effectue une recherche regex de chaque valeur, correspondant sur un espace blanc.
for i in df.columns:
df[i][df[i].apply(lambda i: True if re.search('^\s*$', str(i)) else False)]=None
Il pourrait être optimisé un peu en itérant uniquement dans les champs qui pourraient contenir des chaînes vides:
if df[i].dtype == np.dtype('object')
Mais ce n'est pas vraiment une amélioration
Et enfin, ce code définit les chaînes cibles sur None, ce qui fonctionne avec les fonctions de Pandas comme fillna()
, mais ce serait bien pour l'exhaustivité si je pouvais réellement insérer un NaN
directement au lieu de None
.
replace
avec une regex ... (peut-être que cela devrait être demandé en tant que fonctionnalité).Réponses:
Je pense que
df.replace()
fait le travail, depuis pandas 0.13 :Produit:
Comme Temak l'a souligné, utilisez-le
df.replace(r'^\s+$', np.nan, regex=True)
si vos données valides contiennent des espaces blancs.la source
pd.Series(["1", "#", "9", " .", None]).replace(r"( +\.)|#", "X", regex=True).values
ce qui donne['1', 'X', '9', 'X', None]
df.replace(r'^\s+$', np.nan, regex=True)
Si vous souhaitez remplacer une chaîne vide et des enregistrements avec uniquement des espaces, la bonne réponse est !:
La réponse acceptée
Ne remplace pas une chaîne vide !, vous pouvez essayer vous-même avec l'exemple donné légèrement mis à jour:
Notez également que «fo o» n'est pas remplacé par Nan, bien qu'il contienne un espace. Notez en outre, qu'un simple:
Ne fonctionne pas non plus - essayez-le.
la source
Que diriez-vous:
La
applymap
fonction applique une fonction à chaque cellule du dataframe.la source
isinstance
sera un peu plus rapide.''
. Pour considérer également les chaînes vides, utilisez:d = d.applymap(lambda x: np.nan if isinstance(x, basestring) and (not x or x.isspace()) else x)
Je vais faire ceci:
ou
Vous pouvez supprimer tout str, puis remplacer str vide par
np.nan
.la source
La plus simple de toutes les solutions:
la source
Si vous exportez les données du fichier CSV, cela peut être aussi simple que ceci:
Cela créera la trame de données et remplacera les valeurs vides comme Na
la source
skipinitialspace=True
supprime également tout espace après le délimiteur, ce qui entraînerait la lecture de n'importe quelle longueur d'espace blanc, les chaînes videsnan
. Cependant, si vous souhaitez conserver les espaces initiaux pour une raison quelconque, cette option n'est pas un bon choix.Pour une solution très rapide et simple où vous vérifiez l'égalité par rapport à une valeur unique, vous pouvez utiliser la
mask
méthode.la source
Ce sont tous proches de la bonne réponse, mais je ne dirais pas que tout résoudra le problème tout en restant plus lisible pour les autres lisant votre code. Je dirais que cette réponse est une combinaison de la réponse de BrenBarn et du commentaire de tuomasttik sous cette réponse . La réponse de
isspace
BrenBarn utilise intégré, mais ne prend pas en charge la suppression des chaînes vides, comme OP l'a demandé, et j'aurais tendance à attribuer cela comme le cas d'utilisation standard du remplacement des chaînes par null.Je l'ai réécrit avec
.apply
, donc vous pouvez l'appeler sur unpd.Series
oupd.DataFrame
.Python 3:
Pour remplacer des chaînes vides ou des chaînes entièrement d'espaces:
Pour remplacer des chaînes entièrement d'espaces:
Pour l'utiliser dans Python 2, vous devrez le remplacer
str
parbasestring
.Python 2:
Pour remplacer des chaînes vides ou des chaînes entièrement d'espaces:
Pour remplacer des chaînes entièrement d'espaces:
la source
Cela a fonctionné pour moi. Lorsque j'importe mon fichier csv, j'ai ajouté na_values = ''. Les espaces ne sont pas inclus dans les valeurs NaN par défaut.
df = pd.read_csv (chemin du fichier, na_values = '')
la source
vous pouvez également utiliser un filtre pour le faire.
la source
la source
Ce n'est pas une solution élégante, mais ce qui semble fonctionner, c'est d'enregistrer sur XLSX, puis de le réimporter. Les autres solutions sur cette page n'ont pas fonctionné pour moi, je ne sais pas pourquoi.
la source