【问题标题】:Generate csv based on data of different type根据不同类型的数据生成csv
【发布时间】:2017-02-18 15:30:42
【问题描述】:

我正在尝试根据一系列数据生成一个 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 方法似乎不合适。我尝试使用熊猫,但在添加不同长度的列时遇到问题。要么该列最终由我提供的一个值填充(在这种情况下,应该只填充第一行),要么剩余的行由 NaN 填充。

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

【问题讨论】:

  • 您可以在空值的位置添加空格。你不能吗?
  • 以这种方式存储数据并没有什么意义。列表中的类型不同这一事实应该不是问题,您只需要它们具有相同的长度即可。
  • 这是一个不寻常的数据文件设置,因为通常大多数单元格都被填充,尤其是像 id 这样的指示字段。好奇这个文件将如何使用? xdataydata 有什么关系?它们的长度是否相同,是否是 标签 长度的倍数? Pandas 可以作为 NaN 填充或离开。

标签: python csv pandas


【解决方案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)
]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-16
    • 2020-12-18
    • 2011-10-24
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 2020-05-19
    • 2013-06-02
    相关资源
    最近更新 更多