Подтвердить что ты не робот

Pythonic/эффективный способ сбрасывать пробелы из каждой ячейки фрейма данных Pandas, в которой есть строковый объект

Я читаю CSV файл в DataFrame. Мне нужно удалить пробелы из всех строк, оставляя остальные ячейки неизменными в Python 2.7.

Вот что я делаю:

def remove_whitespace( x ):
    if isinstance( x, basestring ):
        return x.strip()
    else:
        return x

my_data = my_data.applymap( remove_whitespace )

Есть ли лучший или более идиоматический способ Pandas для этого?

Есть ли более эффективный способ (возможно, делая вещи столбцами мудрый)?

Я попытался найти окончательный ответ, но большинство вопросов по этой теме, похоже, заключается в том, как удалять пробелы из самих имен столбцов или предполагать, что все ячейки являются строками.

4b9b3361

Ответ 1

Наткнулся на этот вопрос, ища быстрый и минималистский фрагмент, который я мог бы использовать. Пришлось собрать его сам из сообщений выше. Возможно, кому-то это будет полезно:

data_frame_trimmed = data_frame.apply(lambda x: x.str.strip() if x.dtype == "object" else x)

Ответ 2

Вы можете использовать метод pandas 'Series.str.strip(), чтобы сделать это быстро для каждого столбца, подобного столбцу:

>>> data = pd.DataFrame({'values': ['   ABC   ', '   DEF', '  GHI  ']})
>>> data
      values
0     ABC   
1        DEF
2      GHI  

>>> data['values'].str.strip()
0    ABC
1    DEF
2    GHI
Name: values, dtype: object

Ответ 3

Когда вы вызываете pandas.read_csv, вы можете использовать регулярное выражение, которое соответствует нулевому или более пробелам, за которым следует запятая, а в качестве разделителя - ноль или более пробелов.

Например, здесь "data.csv":

In [19]: !cat data.csv
1.5, aaa,  bbb ,  ddd     , 10 ,  XXX   
2.5, eee, fff  ,       ggg, 20 ,     YYY

(Первая строка заканчивается тремя пробелами после XXX, а вторая строка заканчивается на последней Y.)

Следующее использует pandas.read_csv() для чтения файлов с регулярным выражением ' *, *' в качестве разделителя. (Использование регулярного выражения в качестве разделителя доступно только в движке "python" read_csv().)

In [20]: import pandas as pd

In [21]: df = pd.read_csv('data.csv', header=None, delimiter=' *, *', engine='python')

In [22]: df
Out[22]: 
     0    1    2    3   4    5
0  1.5  aaa  bbb  ddd  10  XXX
1  2.5  eee  fff  ggg  20  YYY

Ответ 4

"data ['values']. str.strip()" ответ выше не работал у меня, но я нашел простую работу. Я уверен, что есть лучший способ сделать это. Функция str.strip() работает на Series. Таким образом, я преобразовал столбец dataframe в серию, разделил пробел, заменил преобразованный столбец обратно в dataframe. Ниже приведен пример кода.

import pandas as pd
data = pd.DataFrame({'values': ['   ABC   ', '   DEF', '  GHI  ']})
print ('-----')
print (data)

data['values'].str.strip()
print ('-----')
print (data)

new = pd.Series([])
new = data['values'].str.strip()
data['values'] = new
print ('-----')
print (new)

Ответ 5

Мы хотим:

  1. Примените нашу функцию к каждому элементу в нашем фрейме данных - используйте applymap.

  2. Используйте type(x)==str (против x.dtype == 'object'), потому что Pandas будет помечать столбцы как object для столбцов смешанных типов данных (столбец object может содержать int и/или str).

  3. Поддерживайте тип данных каждого элемента (мы не хотим преобразовывать все в str а затем удалять пробелы).

Поэтому я нашел следующее проще всего:

df.applymap(lambda x: x.strip() if type(x)==str else x)

Ответ 6

Ниже приведено решение по столбцам с pandas:

import numpy as np

def strip_obj(col):
    if col.dtypes == object:
        return (col.astype(str)
                   .str.strip()
                   .replace({'nan': np.nan}))
    return col

df = df.apply(strip_obj, axis=0)

Это преобразует значения в столбцы типа объекта в строку. Следует проявлять осторожность при использовании столбцов смешанного типа. Например, если ваша колонка - это почтовые индексы с 20001 и "21110", вы получите "20001" и "21110".

Ответ 7

Я нашел следующий код полезным и кое-что, что, вероятно, поможет другим. Этот фрагмент позволит вам удалить пробелы в столбце, а также во всем DataFrame, в зависимости от вашего варианта использования.

import pandas as pd

def remove_whitespace(x):
    try:
        # remove spaces inside and outside of string
        x = "".join(x.split())

    except:
        pass
    return x

# Apply remove_whitespace to column only
df.orderId = df.orderId.apply(remove_whitespace)
print(df)


# Apply to remove_whitespace to entire Dataframe
df = df.applymap(remove_whitespace)
print(df)

Ответ 8

Это сработало для меня - применимо ко всему фрейму данных:

def panda_strip(x):
    r =[]
    for y in x:
        if isinstance(y, str):
            y = y.strip()

        r.append(y)
    return pd.Series(r)

df = df.apply(lambda x: panda_strip(x))