Стрип/обрезать все строки кадра данных
Очистка значений многотипного фрейма данных в 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
Это довольно медленно, что я могу улучшить?
Ответы
Ответ 1
Вы можете использовать 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()
Ответ 2
Деньги выстрел
Вот компактная версия использования 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
Рабочий пример
Вот рабочий пример, размещенный на побрякушке: https://trinket.io/python3/e6ab7fb4ab
Ответ 3
Если вы действительно хотите использовать регулярное выражение, то
>>> df.replace('(^\s+|\s+$)', '', regex=True, inplace=True)
>>> df
0 1
0 a 10
1 c 5
Но это должно быть быстрее сделать следующим образом:
>>> df[0] = df[0].str.strip()
Ответ 4
Вы можете попробовать:
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())
Ответ 5
Вы можете использовать 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'
Обратите внимание на использование strip
, а не regex
, которое намного быстрее
Другой вариант - используйте 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
Ответ 6
def trim(x):
if x.dtype == object:
x = x.str.split(' ').str[0]
return(x)
df = df.apply(trim)