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

Как удалить лишние пробелы из строк при разборе файла csv в Pandas?

У меня есть следующий файл с именем 'data.csv':

    1997,Ford,E350
    1997, Ford , E350
    1997,Ford,E350,"Super, luxurious truck"
    1997,Ford,E350,"Super ""luxurious"" truck"
    1997,Ford,E350," Super luxurious truck "
    "1997",Ford,E350
    1997,Ford,E350
    2000,Mercury,Cougar

И я хотел бы проанализировать его в pandas DataFrame, чтобы DataFrame выглядел следующим образом:

       Year     Make   Model              Description
    0  1997     Ford    E350                     None
    1  1997     Ford    E350                     None
    2  1997     Ford    E350   Super, luxurious truck
    3  1997     Ford    E350  Super "luxurious" truck
    4  1997     Ford    E350    Super luxurious truck
    5  1997     Ford    E350                     None
    6  1997     Ford    E350                     None
    7  2000  Mercury  Cougar                     None

Лучшее, что я мог сделать, это:

    pd.read_table("data.csv", sep=r',', names=["Year", "Make", "Model", "Description"])

Который получает меня:

    Year     Make   Model              Description
 0  1997     Ford    E350                     None
 1  1997    Ford     E350                     None
 2  1997     Ford    E350   Super, luxurious truck
 3  1997     Ford    E350  Super "luxurious" truck
 4  1997     Ford    E350   Super luxurious truck 
 5  1997     Ford    E350                     None
 6  1997     Ford    E350                     None
 7  2000  Mercury  Cougar                     None

Как я могу получить DataFrame без этих пробелов?

4b9b3361

Ответ 1

Вы можете использовать преобразователи:

import pandas as pd

def strip(text):
    try:
        return text.strip()
    except AttributeError:
        return text

def make_int(text):
    return int(text.strip('" '))

table = pd.read_table("data.csv", sep=r',',
                      names=["Year", "Make", "Model", "Description"],
                      converters = {'Description' : strip,
                                    'Model' : strip,
                                    'Make' : strip,
                                    'Year' : make_int})
print(table)

дает

   Year     Make   Model              Description
0  1997     Ford    E350                     None
1  1997     Ford    E350                     None
2  1997     Ford    E350   Super, luxurious truck
3  1997     Ford    E350  Super "luxurious" truck
4  1997     Ford    E350    Super luxurious truck
5  1997     Ford    E350                     None
6  1997     Ford    E350                     None
7  2000  Mercury  Cougar                     None

Ответ 2

Ну, пробелы в ваших данных, поэтому вы не можете читать данные без чтения в пробеле. Однако после того, как вы его прочитали, вы можете лишить пробелы, например, df["Make"] = df["Make"].map(str.strip) (где df - ваш фрейм данных).

Ответ 3

У меня недостаточно репутации, чтобы оставить комментарий, но ответ выше, предлагающий использовать функцию map вместе с strip, не будет работать, если у вас есть значения NaN, так как полоса работает только на символах, а NaN - плавает.

Для этого есть встроенная функция pandas, которую я использовал: pd.core.strings.str_strip(df['Description'])
 где df - ваш dataframe. В моем случае я использовал его на DataFrame с ~ 1,2 миллиона строк, и это было очень быстро.

Ответ 4

Добавление параметра skipinitialspace=True в read_table работало для меня.

Итак, попробуйте:

pd.read_table("data.csv", 
              sep=r',', 
              names=["Year", "Make", "Model", "Description"], 
              skipinitialspace=True)

То же самое работает в pd.read_csv().

Ответ 5

Здесь функция для итерации по каждому столбцу и применения pd.core.strings.str_strip:

def df_strip(df):
  df = df.copy()
  for c in df.columns:
    if df[c].dtype == np.object:
      df[c] = pd.core.strings.str_strip(df[c])
    df = df.rename(columns={c:c.strip()})
  return df

Ответ 6

Функция str.strip() отлично работает на Series. Таким образом, я конвертирую столбец dataframe, который содержит пробелы в Серии, разбивает пробелы с помощью функции str.strip(), а затем заменяет преобразованный столбец обратно на фрейм данных. Ниже приведен пример кода.

import pandas as pd
data = pd.DataFrame({'values': ['   ABC   ', '   DEF', '  GHI  ']})
new = pd.Series([])
new = data['values'].str.strip()
data['values'] = new