Wenn ich die Werte eines Multitype-Datenrahmens in Python / Pandas bereinige, möchte ich die Zeichenfolgen kürzen. Ich mache es derzeit in zwei Anweisungen:
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
Das ist ziemlich langsam, was könnte ich verbessern?
df.replace(r'\s*(.*?)\s*', r'\1', regex=True)
Antworten:
Sie können Spalten
DataFrame.select_dtypes
auswählenstring
und dannapply
funktionierenstr.strip
.Hinweis: Werte können nicht
types
wiedicts
oder seinlists
, weil siedtypes
sindobject
.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
Aber wenn es nur wenige Spalten gibt, verwenden Sie
str.strip
:df[0] = df[0].str.strip()
quelle
Geldschuss
Hier ist eine kompakte Version der Verwendung
applymap
mit einem einfachen Lambda-Ausdruck, diestrip
nur aufgerufen wird , wenn der Wert vom Typ einer Zeichenfolge ist:df.applymap(lambda x: x.strip() if isinstance(x, str) else x)
Vollständiges Beispiel
Ein vollständigeres Beispiel:
import pandas as pd def trim_all_columns(df): """ Trim whitespace from ends of each value across all series in dataframe """ trim_strings = lambda x: x.strip() if isinstance(x, str) else x return df.applymap(trim_strings) # simple example of trimming whitespace from data elements df = pd.DataFrame([[' a ', 10], [' c ', 5]]) df = trim_all_columns(df) print(df) >>> 0 1 0 a 10 1 c 5
Arbeitsbeispiel
Hier ist ein Arbeitsbeispiel, das von trinket gehostet wird: https://trinket.io/python3/e6ab7fb4ab
quelle
type(x) == str
, nichttype(x) is str
isinstance(x, str)
.Du kannst es versuchen:
df[0] = df[0].str.strip()
oder genauer für alle Zeichenfolgenspalten
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())
quelle
Wenn Sie Regex wirklich verwenden möchten, dann
>>> df.replace('(^\s+|\s+$)', '', regex=True, inplace=True) >>> df 0 1 0 a 10 1 c 5
Aber es sollte schneller gehen, um es so zu machen:
>>> df[0] = df[0].str.strip()
quelle
Sie können die
apply
Funktion desSeries
Objekts verwenden:>>> df = pd.DataFrame([[' a ', 10], [' c ', 5]]) >>> df[0][0] ' a ' >>> df[0] = df[0].apply(lambda x: x.strip()) >>> df[0][0] 'a'
Eine weitere Option - verwenden Sie die
apply
Funktion des DataFrame-Objekts:>>> 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
quelle
df[0] = df[0].str.strip()
- wird höchstwahrscheinlich auf größeren DFs schneller seindef trim(x): if x.dtype == object: x = x.str.split(' ').str[0] return(x) df = df.apply(trim)
quelle
가나다 봻
linke Teil des Leerzeichens ist das, was ich will, der rechte Teil ist Müll. Trimmfunktion extrahieren, was ich aus Rohdaten will.