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

Как сделать разделитель в пандах read_csv более гибким в отношении пробелов?

Мне нужно создать фрейм данных, используя данные, хранящиеся в файле. Для этого я хочу использовать метод read_csv. Однако разделитель не очень регулярный. Некоторые столбцы разделяются вкладками (\t), другие разделяются пробелами. Более того, некоторые столбцы могут быть разделены на 2 или 3 или более пробелов или даже комбинацией пробелов и вкладок (например, 3 пробела, две вкладки и 1 пробел).

Есть ли способ сказать pandas правильно обрабатывать эти файлы?

Кстати, у меня нет этой проблемы, если я использую Python. Я использую:

for line in file(file_name):
   fld = line.split()

И он работает отлично. Не имеет значения, есть ли между полями 2 или 3 пробела. Даже комбинации пробелов и вкладок не создают никаких проблем. Может ли pandas сделать то же самое?

4b9b3361

Ответ 1

В документации вы можете использовать регулярное выражение или delim_whitespace:

>>> import pandas as pd
>>> for line in open("whitespace.csv"):
...     print repr(line)
...     
'a\t  b\tc 1 2\n'
'd\t  e\tf 3 4\n'
>>> pd.read_csv("whitespace.csv", header=None, delimiter=r"\s+")
   0  1  2  3  4
0  a  b  c  1  2
1  d  e  f  3  4
>>> pd.read_csv("whitespace.csv", header=None, delim_whitespace=True)
   0  1  2  3  4
0  a  b  c  1  2
1  d  e  f  3  4

Ответ 2

>>> pd.read_csv("whitespace.csv", header = None, sep = "\s+|\t+|\s+\t+|\t+\s+")

будет использовать любую комбинацию любого количества пробелов и вкладок в качестве разделителя.

Ответ 3

Мы можем рассмотреть это, чтобы заботиться обо всех комбинациях и ноль или более случаев.

pd.read_csv("whitespace.csv", header = None, sep = "[ \t]*,[ \t]*")

Ответ 4

Pandas имеет два считывателя csv, только гибко относится к избыточному ведущему пробелу:

pd.read_csv("whitespace.csv", skipinitialspace=True)

в то время как один не

pd.DataFrame.from_csv("whitespace.csv")

Также нет гибкой гибкости относительно конечного пробела, см. ответы с регулярными выражениями. Избегайте delim_whitespace, поскольку он также позволяет просто пробелы (без или или t) в качестве разделителей.