Как бороться с многозначными линейными терминаторами в пандах - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть \x02\n в качестве ограничителя строки в CSV-файле, который я пытаюсь проанализировать.Однако я не могу использовать два символа в пандах, он разрешает только один, например:

>>> data = pd.read_csv(file, sep="\x01", lineterminator="\x02")
>>> data.loc[100].tolist()
['\n1475226000146', '1464606', 'Juvenile', '1', 'http://itunes.apple.com/artist/juvenile/id1464606?uo=5', '1']

Или:

data = pd.read_csv(file, sep="\x01", lineterminator="\n")
 >>> data.loc[100].tolist()
['1475226000146', '1464606', 'Juvenile', '1', 'http://itunes.apple.com/artist/juvenile/id1464606?uo=5', '1\x02']

Здесь мы видим, что \n не имеетбыл отрублен правильно.Как лучше всего прочитать файл csv в пандах с указанным выше разделителем?

1 Ответ

0 голосов
/ 19 декабря 2018

Начиная с v0.23, pandas не поддерживает многосимвольные ограничители строки.Ваш код в настоящее время возвращает:

s = "this\x01is\x01test\x02\nthis\x01is\x01test2\x02"
df = pd.read_csv(
    pd.compat.StringIO(s), sep="\x01", lineterminator="\x02", header=None)

df
        0   1      2
0    this  is   test
1  \nthis  is  test2

Ваша единственная возможность (на данный момент) - удалить начальные пробелы из первого столбца.Вы можете сделать это с помощью str.lstrip.

df.iloc[:, 0] = df.iloc[:, 0].str.lstrip()
# Alternatively,
# df.iloc[:, 0] = [s.lstrip() for s in df.iloc[:, 0]]

df

      0   1      2
0  this  is   test
1  this  is  test2

Если вам нужно обрабатывать несколько других типов разделителей строки (кроме только новой строки), вы можете передать их строку:

line_terminators = ['\n', ...]
df.iloc[:, 0] = df.iloc[:, 0].str.lstrip(''.join(line_terminators))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...