Как разобрать строку в csv в python

#python #pandas #csv #parsing

#python #pandas #csv #синтаксический анализ

Вопрос:

У меня есть str с данными, которые выглядят так

 2013/04/15, 54332, 2013/04/16, 67608, 2013/04/17, 56535, 2013/04/18, 46484
 

где есть дата, а затем значение, как мне перенести это в csv со столбцами как для даты, так и для значений? Я пытался сделать это:

 df = pd.Dataframe(list(reader(data)))
df.to_csv('Data.csv', index=False)
 

но когда я это делаю, он помещает один символ строки в каждую строку и только в один столбец.

Комментарии:

1. просмотрите документацию для python, встроенную в функцию split, чтобы превратить вашу строку, разделенную запятыми, в список. Затем вы можете решить свою проблему с помощью итерации списка.

Ответ №1:

Вы можете сделать следующее:

 data = data.replace(' ', '').split(',')
df = pd.DataFrame({'Date': data[::2], 'Value': data[1::2]})
 

Вывод:

          Date  Value
0  2013/04/15  54332
1  2013/04/16  67608
2  2013/04/17  56535
3  2013/04/18  46484
 

Комментарии:

1. почему replace() , а не просто split(', ') — т.е. с запятой и пробелом?

2. Хорошее предложение @buran! Хотя split(', ') это хорошо работает для этого примера данных, это может не сработать, если какой-либо из пробелов отсутствует (или содержит более одного пробела). Использование replace позволяет избежать таких проблем.

3. Предполагается, что ваш код будет работать с образцами данных, предоставленными OP. Они должны указать, есть ли возможность получить другой ввод. Если мы будем придерживаться той же линии рассуждений — что, если вместо запятой будет точка с запятой или разрыв в шаблоне date-value? Только мои 2 цента.

4. Это работает для образцов данных. Раньше я работал с файлами csv, и это довольно распространенные проблемы с пробелами между запятыми и гораздо менее распространенные другие проблемы. Вот почему я это написал (привычка иметь дело с пробелами).

5. Тем не менее, я полностью согласен с тем, что использование split(', ') также работает, и это также делает код более чистым (что, я думаю, также важно). Не стесняйтесь редактировать ответ, если хотите.

Ответ №2:

Должно работать следующее:

 import pandas as pd

l=[i.strip() for i in s.split(',')]
dates=[l[i] for i in range(0,len(l),2)]
values=[l[i] for i in range(1,len(l),2)]

df=pd.DataFrame({'date':dates, 'value': values})

>>> print(df)

         date    value
0  2013/04/15  54332
1  2013/04/16  67608
2  2013/04/17  56535
3  2013/04/18  46484
 

Затем вы можете сохранить ее в виде CSV-файла, как показано ниже:

 df.to_csv('Data.csv', index=False)