【问题标题】:Write floats to a csv file to 2 significant figures将浮点数写入 csv 文件到 2 个有效数字
【发布时间】:2019-10-31 23:14:04
【问题描述】:

我的 writer 函数如下所示:

with open(filename, "w") as file:
    file.truncate(0)
    writer = csv.writer(file)
    writer.writerows(input_list)

我的input_list 看起来像:

[[10.0, 11.0, 20.0, 20.0, 0.8], [40.0, 42.0, 20.0, 20.0, 0.6]]

我的输出 csv 文件如下所示:

10.0,11.0,20.0,20.0,0.8
40.0,42.0,20.0,20.0,0.6

我希望它看起来像:

10, 11, 20, 20, 0.8
40, 42, 20, 20, 0.6

我想要数字本身后面的空格格式。虽然我可以在程序中添加一些内容以在元素之间创建一个空格并检查数字是否小于 1,但在将其转换为 int(大于 1 的数字不能是浮点数)之前,我想寻找一个更pythonic和优雅的解决方案。

【问题讨论】:

  • “0.6”只有一位有效数字,正如数学家定义的那样。您希望 0、123 和 0.123 的输出是什么,或者类似的值永远不会出现?
  • @EricPostpischil 0 和 123 可以出现,但 0.123 永远不会出现。我想将这两个表示为 0 和 123

标签: python list csv floating-point int


【解决方案1】:
>>> from math import log10, floor
>>> def round_to_1(x):
...   return round(x, -int(floor(log10(abs(x)))))

循环遍历您的元素并在写入 csv 之前应用此函数。费力,但应该工作。

【讨论】:

  • 有没有一种方法可以将其映射到列表列表中的每个元素,所有元素都与 csv_writer 位于同一行中?也许是地图功能?
  • 只需使用双循环。对于列表中的行:对于行中的项目。
【解决方案2】:

您可以为此使用 pandas 库。

=^..^=

import pandas as pd

data = [[10.0, 11.0, 20.0, 20.0, 0.8], [40.0, 42.0, 20.0, 20.0, 0.6]]

df = pd.DataFrame(data)
# convert values to int
df[0] = df[0].astype(int)
df[1] = df[1].astype(int)
df[2] = df[2].astype(int)
df[3] = df[3].astype(int)

# save data frame
df.to_csv('data.csv')

输出:

    0   1   2   3    4
0  10  11  20  20  0.8
1  40  42  20  20  0.6

【讨论】:

  • 没有熊猫怎么办?
  • 使用原生 Python 工具?
猜你喜欢
  • 1970-01-01
  • 2021-03-31
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多