Стрип/обрезать все строки кадра данных

Очистка значений многотипного фрейма данных в 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)