根据不同类型

时间:2017-02-18 15:30:42

标签: python csv pandas

我正在尝试根据一系列数据生成一个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填充。

你能否建议如何解决这个问题?

1 个答案:

答案 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)
]