Как сделать разделитель в пандах read_csv более гибким в отношении пробелов?
Мне нужно создать фрейм данных, используя данные, хранящиеся в файле. Для этого я хочу использовать метод read_csv
. Однако разделитель не очень регулярный. Некоторые столбцы разделяются вкладками (\t
), другие разделяются пробелами. Более того, некоторые столбцы могут быть разделены на 2 или 3 или более пробелов или даже комбинацией пробелов и вкладок (например, 3 пробела, две вкладки и 1 пробел).
Есть ли способ сказать pandas правильно обрабатывать эти файлы?
Кстати, у меня нет этой проблемы, если я использую Python. Я использую:
for line in file(file_name):
fld = line.split()
И он работает отлично. Не имеет значения, есть ли между полями 2 или 3 пробела. Даже комбинации пробелов и вкладок не создают никаких проблем. Может ли pandas сделать то же самое?
Ответы
Ответ 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) в качестве разделителей.