Возможно ли, чтобы параметр "sep" в pandas csv_reader использовал пробел слово и число? - PullRequest
0 голосов
/ 17 июня 2019

Я использую pandas (python) csv_reader, и я не знаю, возможно или эффективно иметь выражение регулярного выражения для параметра "sep", который возвращает фрейм данных, как я хочу.

Я читаю из одного столбца CSV, который я должен преобразовать в 11 столбцов CSV.

Я пытаюсь получить разделитель, который достигает:

  1. Использует длинные пробелы в качестве разделителя;
  2. Использование пробелов между словом и строкой, содержащей числа (999-BBB CCCC);
  3. Использование пробелов между строкой, содержащей цифры и слово (AAA 999-BBB).

Данные поступают в следующем формате (несколько строк):

111-XXX XX XXXX           AAA 999-BBB CCCC            0,00                  01/01/1950     111.111        22. DDDD        11.111,11       11.111,11       

До сих пор я добился только разделения больших пробелов и пробелов точкой с: sep = r "[.] {2,} "

Мне нужно, чтобы данные стали такими:

111-XXX XX XXXX | AAA | 999-BBB| CCCC | 0,00 | 01/01/1950 | 111.111 | 22 | DDDD | 11.111,11 | 11.111,11 

Попытка обнаружить пробел, за которым следует число (чтобы разделить AAA от 999-BBB) с помощью" [] [0-9] "заканчивает тем, что удалял также первые числа (приводя к 99-BBB), что нежелательно.

Это мой код:

df = pd.read_csv("myarchive.csv",
                 sep=r"[ .]{2,}",
                 engine="python",
                 names = col,
                 usecols = col,
                 na_filter=False,
                 keep_default_na=False)

1 Ответ

1 голос
/ 17 июня 2019

Передайте delim_whitespace=True пареметр. Из документов:

delim_whitespace: bool, по умолчанию False

Указывает, будут ли пробелы (например, '' или '') использоваться в качестве sep. Эквивалентно установке sep = '\ s +'. Если для этого параметра установлено значение True, для параметра разделителя ничего не следует передавать.

А затем вручную исправьте первое поле.

Редактировать: Вы также можете использовать read_fwf, если формат всегда один и тот же:

widths = [
    15,  # 111-XXX XX XXXX
    14,  # AAA
    8,   # 999-BBB
    16,  # CCCC
    16,  # 0,00
    17,  # 01/01/1950
    16,  # 111.111
    7,   # 22.
    5,   # DDDD
    17,  # 11.111,11
    16,  # 11.111,11
]
df = pd.read_fwf('test.csv', widths=widths, header=None)
print(df.values)
...