104 votes

Supprimer / couper toutes les chaînes d'une trame de données

En nettoyant les valeurs d'une trame de données multitype en python / pandas, je veux couper les chaînes. Je le fais actuellement en deux instructions:

 import pandas as pd

df = pd.DataFrame([['  a  ', 10], ['  c  ', 5]])

df.replace('^\s+', '', regex=True, inplace=True) #front
df.replace('\s+$', '', regex=True, inplace=True) #end

df.values
 

C'est assez lent, que pourrais-je améliorer?

190voto

jezrael Points 290608

Vous pouvez utiliser DataFrame.select_dtypes pour sélectionner string colonnes et ensuite, apply fonction str.strip.

Avis: les Valeurs ne peuvent pas être types comme dicts ou lists, en raison de leur dtypes est object.

df_obj = df.select_dtypes(['object'])
print (df_obj)
0    a  
1    c  

df[df_obj.columns] = df_obj.apply(lambda x: x.str.strip())
print (df)

   0   1
0  a  10
1  c   5

Mais si il y a seulement quelques colonnes utiliser str.strip:

df[0] = df[0].str.strip()

96voto

Jonathan B. Points 718

Money Shot

Voici une version compacte de l'utilisation de applymap avec une expression lambda simple pour appeler strip uniquement lorsque la valeur est de type chaîne:

 df.applymap(lambda x: x.strip() if type(x) is str else x)
 

Exemple complet

Un exemple plus complet:

 import pandas as pd


def trimAllColumns(df):
    """
    Trim whitespace from ends of each value across all series in dataframe
    """
    trimStrings = lambda x: x.strip() if type(x) is str else x
    return df.applymap(trimStrings)


# simple example of trimming whitespace from data elements
df = pd.DataFrame([['  a  ', 10], ['  c  ', 5]])
df = trimAllColumns(df)
print(df)


>>>
   0   1
0  a  10
1  c   5
 

Exemple de travail

Voici un exemple de travail hébergé par trinket: https://trinket.io/python3/65078f3cdf

10voto

Aakash Makwana Points 426

Tu peux essayer:

 df[0] = df[0].str.strip()
 

ou plus spécifiquement pour toutes les colonnes de chaînes

 non_numeric_columns = list(set(df.columns)-set(df._get_numeric_data().columns))
df[non_numeric_columns] = df[non_numeric_columns].apply(lambda x : str(x).strip())
 

9voto

Roman Pekar Points 31863

Si vous voulez vraiment utiliser l'expression régulière, alors

 >>> df.replace('(^\s+|\s+$)', '', regex=True, inplace=True)
>>> df
   0   1
0  a  10
1  c   5
 

Mais il devrait être plus rapide de le faire comme ceci:

 >>> df[0] = df[0].str.strip()
 

7voto

Dekel Points 41575

Vous pouvez utiliser l' apply fonction de l' Series objet:

>>> df = pd.DataFrame([['  a  ', 10], ['  c  ', 5]])
>>> df[0][0]
'  a  '
>>> df[0] = df[0].apply(lambda x: x.strip())
>>> df[0][0]
'a'

Remarque l'utilisation de l' strip et pas l' regex ce qui est beaucoup plus rapide

Une autre option utiliser l' apply fonction de la DataFrame objet:

>>> df = pd.DataFrame([['  a  ', 10], ['  c  ', 5]])
>>> df.apply(lambda x: x.apply(lambda y: y.strip() if type(y) == type('') else y), axis=0)

   0   1
0  a  10
1  c   5

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X