Генерировать csv на основе данных другого типа

Я пытаюсь создать файл csv на основе диапазона фрагментов данных: int, float, string, список строк, список float:

temp = 15.3
id = '98'
tags = ['b34s', '7eo9', '7w49']
hum = 1.89
x_data = [32,87,87,742,342,7.2,992,...]
y_data = [65.3,89.7,458.8,589,529,8789,489,...]

Списки x_data и y_data могут содержать тысячи элементов. Я хотел бы, чтобы сгенерированный файл выглядел следующим образом:

|temp|id|tags|hum.|x_data|y_data|
|15.3|98|b34s|1.89|    32|  65.3|
|    |  |7eo9|    |    87|  89.7|
|    |  |7w49|    |    87| 458.8|
|    |  |    |    |   742|   589|
|    |  |    |    |   342|   529|
|    |  |    |    |   7.2|  8789|
|    |  |    |    |   992|   489|
|    |  |    |    |   ...|   ...|

Как видите, csv состоит из столбцов. Некоторые столбцы содержат только одну часть данных, некоторые больше. Я попытался добиться этого с помощью библиотеки csv. Однако метод writerow кажется неподходящим из-за разных типов данных, которые необходимо сохранить. Я пытался использовать pandas, но у меня возникли проблемы с добавлением столбцов разной длины. Либо столбец заполняется одним значением, которое я предоставляю (в этом случае должна быть только первая строка), либо оставшиеся строки заполняются NaN.

Не подскажете, как решить эту проблему?


person bkr879    schedule 18.02.2017    source источник
comment
Вы можете добавить пробелы вместо нулевых значений. не можешь?   -  person Mohamad Ibrahim    schedule 18.02.2017
comment
На самом деле нет смысла хранить ваши данные таким образом. Тот факт, что типы в ваших списках различаются, не должен быть проблемой, вам просто нужно, чтобы они были одинаковой длины.   -  person Robin    schedule 18.02.2017
comment
Это необычная настройка файла данных, так как обычно большинство ячеек заполнено, особенно поля индикатора, такие как id. Интересно, как этот файл будет использоваться? Как соотносятся xdata и ydata? Имеют ли они одинаковую длину и кратны ли они длине тегов? Панды могут заполнить или оставить как NaN.   -  person Parfait    schedule 18.02.2017


Ответы (1)


Вы можете использовать библиотеку itertools, если все, что у вас есть, является итерируемым.

Существует функция izip_longest в python 2.7 или zip_longest в python 3.x. Эта функция принимает итерации и возвращает генератор, который будет работать до тех пор, пока не будет исчерпано последнее значение в самой длинной итерации. Вы можете найти документацию здесь для itertools в версии 2.7.

Эта функция имеет параметр fillvalue, который позволяет вам точно выбрать, каким значением заполнить пустые.

Вы можете передать возвращенный генератор непосредственно в функцию csv.writerows.

>>> # assuming your values are iterables
>>> temp = [15.3]
>>> id = ['98']
>>> tags = ['b34s', '7eo9', '7w49']
>>> hum = [1.89]
>>> x_data = [32,87,87,742,342,7.2,992]
>>> y_data = [65.3,89.7,458.8,589,529,8789,489]

>>> from itertools import izip_longest
>>> [zipped for zipped in izip_longest(temp, id, tags, hum, x_data, y_data)]
[(15.3, '98', 'b34s', 1.89, 32, 65.3),
 (None, None, '7eo9', None, 87, 89.7),
 (None, None, '7w49', None, 87, 458.8),
 (None, None, None, None, 742, 589),
 (None, None, None, None, 342, 529),
 (None, None, None, None, 7.2, 8789),
 (None, None, None, None, 992, 489)
]
>>> [zipped for zipped in izip_longest(temp, id, tags, hum, x_data, y_data, fillvalue='')]
[(15.3, '98', 'b34s', 1.89, 32, 65.3),
 ('', '', '7eo9', '', 87, 89.7),
 ('', '', '7w49', '', 87, 458.8),
 ('', '', '', '', 742, 589),
 ('', '', '', '', 342, 529),
 ('', '', '', '', 7.2, 8789),
 ('', '', '', '', 992, 489)
]
person rabid_oxen    schedule 18.02.2017