Czyszczenie wartości ramki danych typu multitype w python / pandas, chcę przyciąć ciągi. Obecnie robię to w dwóch instrukcjach:
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
To jest dość powolne, co mogę poprawić?
df.replace(r'\s*(.*?)\s*', r'\1', regex=True)
Odpowiedzi:
Możesz użyć
DataFrame.select_dtypes
do zaznaczeniastring
kolumn, a następnieapply
funkcjistr.strip
.Uwaga: Wartości nie mogą być
types
takie jakdicts
lublists
, ponieważdtypes
są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
Ale jeśli jest tylko kilka kolumn, użyj
str.strip
:df[0] = df[0].str.strip()
źródło
Zastrzyk gotówki
Oto kompaktowa wersja użycia
applymap
z prostym wyrażeniem lambda do wywołaniastrip
tylko wtedy, gdy wartość jest typu string:df.applymap(lambda x: x.strip() if isinstance(x, str) else x)
Pełny przykład
Bardziej kompletny przykład:
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
Przykład roboczy
Oto działający przykład hostowany przez trinket: https://trinket.io/python3/e6ab7fb4ab
źródło
type(x) == str
, a nietype(x) is str
isinstance(x, str)
.Możesz spróbować:
df[0] = df[0].str.strip()
a dokładniej dla wszystkich kolumn ciągów
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())
źródło
Jeśli naprawdę chcesz użyć wyrażenia regularnego, to
>>> df.replace('(^\s+|\s+$)', '', regex=True, inplace=True) >>> df 0 1 0 a 10 1 c 5
Ale powinno być szybsze zrobienie tego w ten sposób:
>>> df[0] = df[0].str.strip()
źródło
Można korzystać z
apply
funkcji tegoSeries
obiektu:>>> df = pd.DataFrame([[' a ', 10], [' c ', 5]]) >>> df[0][0] ' a ' >>> df[0] = df[0].apply(lambda x: x.strip()) >>> df[0][0] 'a'
Inna opcja - skorzystaj z
apply
funkcji obiektu DataFrame:>>> 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
źródło
df[0] = df[0].str.strip()
- najprawdopodobniej będzie szybszy na większych DFdef trim(x): if x.dtype == object: x = x.str.split(' ').str[0] return(x) df = df.apply(trim)
źródło
가나다 봻
lewa część pusta jest tym, czego chcę, prawa część to śmieci. funkcja przycinania wyodrębnia to, co chcę z surowych danych.