Как использовать Pandas для чтения файла CSV с разделителем, существующим в последнем поле? - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть необработанные данные в следующем формате:

JobID,Publish,Expire,TitleAndDetail
7428,17/12/2006 2:00:00 PM,28/01/2007 2:00:00 PM,Project Engineer - Mechanical      Looking,.....,....
7429,9/03/2006 2:00:00 PM,27/02/2007 2:00:00 PM,Supply Teacher      The job is,.....,.....

Как видите, разделитель - запятая, однако последний столбец - это фрагмент текста с запятыми внутри. Я использую функцию pandas read_csv для чтения этого файла CSV.Тем не менее, в pandas dataframe части текста после 4-й запятой в каждой строке теряются.

raw_data = pd.read_csv(r"/ABC/JobDetails.csv",
                       names=['JobID', 'Publish', 'Expire', 'TitleAndDetail'],
                       header=None
                       )

При использовании функции string.split() я могу указать параметр maxsplit, который позволяет мне сохранять всесодержимое в последнем столбце, даже если запятых много.Есть ли подобная функциональность в Pandas?

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

Вы можете сделать так:

with open("file.csv", "r") as fp:
    reader = csv.reader(fp, delimiter=",")
    rows = [x[:3] + [','.join(x[3:])] for x in reader]
    df = pd.DataFrame(rows)
    df.columns = df.iloc[0]
    df = df.reindex(df.index.drop(0))
    print df
0 голосов
/ 26 сентября 2018

Считайте файл вручную, а затем создайте фрейм данных:

rows = []

with open('somefile.csv') as f:
  keys = next(f).split(',')
  for line in f:
     rows.append(dict(zip(keys, line.split(',', 3))))

df = pd.DataFrame(rows)

.split принимает необязательный параметр, чтобы ограничить число раз, которое он разделяет на разделитель.Пропуск 3 означает, что он игнорирует запятые в последнем поле:

>>> s.split(',', 3)
['7428',
 '17/12/2006 2:00:00 PM',
 '28/01/2007 2:00:00 PM',
 'Project Engineer - Mechanical      Looking,.....,....']

Далее мы создаем словарь с ключами из строки заголовка и значениями из строк данных:

>>> f = 'JobID,Publish,Expire,TitleAndDetail'.split(',')
>>> dict(zip(f, s.split(',', 3)))
{'JobID': '7428',
 'Publish': '17/12/2006 2:00:00 PM',
 'Expire': '28/01/2007 2:00:00 PM',
 'TitleAndDetail': 'Project Engineer - Mechanical      Looking,.....,....'}

Наконец, мы составляем список этих словарей (в rows) и передаем его в качестве аргумента для создания нашего объекта фрейма данных.

0 голосов
/ 26 сентября 2018

Итак, вы можете попробовать вот что:

raw_data = pd.read_csv(r"/ABC/JobDetails.csv",
                       squeeze=True,
                       sep="\a"
                       )

Это даст вам серию, проигнорировав "," s

Тогда вы можете сделать:

df = raw_data.str.split(",", n=4, expand=True)
df.columns = ['JobID', 'Publish', 'Expire', 'TitleAndDetail']

Это должно разделиться на 4 столбца и переименовать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...