我正在尝试根据一系列数据生成一个csv文件:int,float,string,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库来实现这一点。但是,由于要存储的数据类型不同,写法方法似乎不合适。我尝试使用pandas,但是我在添加不同长度的列时遇到了问题。最后一列是由我提供的一个值填充的(在这种情况下只应该是第一行),或者其余的行由NaN填充。
你能否建议如何解决这个问题?
答案 0 :(得分:1)
如果你拥有的一切都是可迭代的,你可以使用itertools库。
python 2.7中有一个函数izip_longest,python 3.x中有一个zip_longest函数。此函数接受迭代并返回一个将继续运行的生成器,直到最长迭代中的最后一个值用完为止。您可以找到文档here for itertools in 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)
]