Очистив значения фрейма данных с несколькими типами в python / pandas, я хочу обрезать строки. Сейчас я делаю это по двум инструкциям:
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
Это довольно медленно, что я могу улучшить?
df.replace(r'\s*(.*?)\s*', r'\1', regex=True)
Ответы:
Вы можете использовать
DataFrame.select_dtypes
для выбораstring
столбцов, а затем дляapply
функцииstr.strip
.Примечание: значения не могут быть
types
похожими наdicts
илиlists
, потому что ониdtypes
есть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
Но если столбцов всего несколько, используйте
str.strip
:df[0] = df[0].str.strip()
источник
Деньги выстрел
Вот компактная версия использования
applymap
простого лямбда-выражения для вызоваstrip
только тогда, когда значение имеет строковый тип:df.applymap(lambda x: x.strip() if isinstance(x, str) else x)
Полный пример
Более полный пример:
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
Рабочий пример
Вот рабочий пример, размещенный на trinket: https://trinket.io/python3/e6ab7fb4ab
источник
type(x) == str
, а неtype(x) is str
isinstance(x, str)
.Ты можешь попробовать:
df[0] = df[0].str.strip()
или более конкретно для всех строковых столбцов
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())
источник
Если вы действительно хотите использовать регулярное выражение, тогда
>>> df.replace('(^\s+|\s+$)', '', regex=True, inplace=True) >>> df 0 1 0 a 10 1 c 5
Но быстрее должно получиться вот так:
>>> df[0] = df[0].str.strip()
источник
Вы можете использовать
apply
функцию отSeries
объекта:>>> df = pd.DataFrame([[' a ', 10], [' c ', 5]]) >>> df[0][0] ' a ' >>> df[0] = df[0].apply(lambda x: x.strip()) >>> df[0][0] 'a'
Другой вариант - воспользоваться
apply
функцией объекта 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
источник
df[0] = df[0].str.strip()
- скорее всего, будет быстрее на большихdef trim(x): if x.dtype == object: x = x.str.split(' ').str[0] return(x) df = df.apply(trim)
источник
가나다 봻
левая часть пустого - это то, что я хочу, правая часть - это мусор. Функция trim извлекает из необработанных данных то, что я хочу.