Pythonic/moyen efficace de suppression des espaces de tous les Pandas trame de Données de la cellule qui a un stringlike objet en elle
Je suis en train de lire un fichier CSV dans un DataFrame. J'ai besoin de dépouiller les espaces de toutes les stringlike cellules, laissant les autres cellules inchangé en Python 2.7.
Ici est ce que je fais:
def remove_whitespace( x ):
if isinstance( x, basestring ):
return x.strip()
else:
return x
my_data = my_data.applymap( remove_whitespace )
Est-il mieux ou plus idiomatique Pandas façon de le faire?
Est-il un moyen plus efficace (peut-être en faisant des choses colonne sage)?
J'ai essayé de chercher une réponse définitive, mais la plupart des questions sur ce sujet semble être la façon de suppression des espaces dans la colonne des noms eux-mêmes, ou supposer que les cellules sont toutes les chaînes.
Qu'arriverait-il si vous étiez à faire x.strip() sur un élément qui n'est pas une instance d'un basestring? Si il ne sont pas les inconvénients peut-être que vous pourriez supprimer le vérifier et de le remplacer par un bloc try et except. Qui pourrait accélérer les choses.
Êtes-vous à l'aide de
Je pourrais avoir des espaces avant et après les données que j'ai soucier de la cellule, donc je pense que skipinitialspace fixe seulement la moitié du problème.
essayez d'appeler .strip() sur un non-stringlike objet (ou d'une chose qui n'a pas une bande de méthode, comme un type de données numérique) génère une exception. Vous avez raison, la manipulation de l'exception pourrait être plus rapide que de faire le check - selon la base de données et la fréquence des exceptions.
J'avais peur que ce pourrait être le cas.
Êtes-vous à l'aide de
pandas.read_csv
(pandas.pydata.org/pandas-docs/version/0.17.0/generated/...)? Avez-vous essayé skipinitialspace=True
?Je pourrais avoir des espaces avant et après les données que j'ai soucier de la cellule, donc je pense que skipinitialspace fixe seulement la moitié du problème.
essayez d'appeler .strip() sur un non-stringlike objet (ou d'une chose qui n'a pas une bande de méthode, comme un type de données numérique) génère une exception. Vous avez raison, la manipulation de l'exception pourrait être plus rapide que de faire le check - selon la base de données et la fréquence des exceptions.
J'avais peur que ce pourrait être le cas.
OriginalL'auteur deadcode | 2015-11-18
Vous devez vous connecter pour publier un commentaire.
Trébuché sur cette question alors que vous cherchez un moyen rapide et minimaliste, l'extrait de code que je pourrais utiliser. A l'assembler moi-même à partir de postes ci-dessus. Peut-être que quelqu'un va trouver utile:
.rename(columns=lambda x: x.strip())
à partir de stackoverflow.com/a/21607530/4355695Cette méthode a échoué pour moi si les Pandas étiquetés une colonne comme
object
. Les Pandas seront étiquette de colonnes avec un mélange de types de données commeobject
qui ne veut pas forcément dire que chaque élément de cette colonne est unestr
.Michael, pour les vraiment mélangés, vous pouvez utiliser l'OP méthode.
peut-être isinstance(x, str) serait une meilleure solution pour vérifier si une chaîne de caractères ou pas...
OriginalL'auteur Adam Owczarczyk
Vous pouvez utiliser des pandas
Series.str.strip()
méthode pour le faire rapidement pour chaque chaîne comme la colonne:OriginalL'auteur jakevdp
Lorsque vous appelez
pandas.read_csv
, vous pouvez utiliser une expression régulière qui correspond à zéro ou plusieurs espaces, suivi par une virgule suivie de zéro ou plus d'espace comme délimiteur.Par exemple, voici
"data.csv"
:(La première ligne se termine avec trois espaces après
XXX
, tandis que la deuxième ligne se termine à la dernièreY
.)Les utilisations suivantes
pandas.read_csv()
pour lire les fichiers, avec l'expression régulière' *, *'
comme délimiteur. (À l'aide d'une expression régulière comme délimiteur n'est disponible que dans le "python" moteur deread_csv()
.)OriginalL'auteur Warren Weckesser
Le "data['values'].str.strip()" la réponse ci-dessus ne fonctionne pas pour moi, mais j'ai trouvé un travail simple autour de. Je suis sûr qu'il ya une meilleure façon de le faire. La str.strip() fonctionne sur la Série. Ainsi, j'ai converti le dataframe colonne dans une Série, dépouillé de l'espace, a remplacé le converti de la colonne de retour dans le dataframe. Ci-dessous le code d'exemple.
OriginalL'auteur S. Herron
Ici est une colonne de solution sage avec les pandas s'appliquent:
Ceci permet de convertir des valeurs dans l'objet des colonnes de type string. Doivent prendre garde avec mixte-type de colonnes. Par exemple, si votre colonne est codes postaux avec 20001 et ' 21110 ', vous vous retrouverez avec '20001' et '21110'.
OriginalL'auteur Blake
J'ai trouvé le code suivant utiles et quelque chose qui serait susceptible d'aider les autres. Cet extrait de code va vous permettre de supprimer les espaces dans une colonne ainsi que dans l'ensemble du DataFrame, selon votre cas d'utilisation.
OriginalL'auteur FunnyChef
Nous voulons:
Applique notre fonction à chaque élément de notre dataframe - utilisation
applymap
.Utilisation
type(x)==str
(par rapport àx.dtype == 'object'
) parce que les Pandas seront étiquette de colonnes queobject
pour les colonnes de mélanges de types de données (unobject
colonne peut contenir desint
et/oustr
).str
et puis la bande des espaces).Donc, j'ai trouvé ce qui suit pour être la plus facile:
df.applymap(lambda x: x.strip() if type(x)==str else x)
OriginalL'auteur Michael Silverstein