【问题标题】:Convert column values to float using a conversion function使用转换函数将列值转换为浮点数
【发布时间】:2020-02-11 18:53:01
【问题描述】:

鉴于以下 CSV

+-------------------------------+-------------+--------------------+--------------+
|           Timestamp           | DoublePoint |      HexPoint      | BooleanPoint |
+-------------------------------+-------------+--------------------+--------------+
| 07/23/2019 16:53:12.523-07:00 |         0.0 | 0x0000000000000001 | True         |
| 07/23/2019 16:53:14.519-07:00 |         0.0 | 0x0000000000000002 | False        |
| 07/23/2019 16:53:16.516-07:00 |        0.25 | 0x0000000000000003 | true         |
| 07/23/2019 16:53:18.513-07:00 |        0.25 | 0x00000004         | false        |
| 07/23/2019 16:53:20.526-07:00 |         0.0 | 0x00000005         | True         |
| 07/23/2019 16:53:22.522-07:00 |        0.50 | 0x00000006         | False        |
| 07/23/2019 16:53:24.519-07:00 |         0.5 | 0x00000007         | True         |
| 07/23/2019 16:53:26.516-07:00 |      0.9999 | 0x00000008         | False        |
+-------------------------------+-------------+--------------------+--------------+

我需要使用 pandas 库读取它并获得一个 DataFrame,其中除第一列之外的所有列都是浮动的。 对于数字,这应该是自动的,但对于其他类型的输入,如 HexPoint 和 BooleanPoint,我需要提供一个转换函数来将它们转换为数字。

在本例中,HexPoint 值应转换为十进制,BooleanPoints 应将 True/true 转换为 1,False/false 转换为 0。

所以生成的 DataFrame 应该如下所示:

+-------------------------------+-------------+----------+--------------+
|           Timestamp           | DoublePoint | HexPoint | BooleanPoint |
+-------------------------------+-------------+----------+--------------+
| 07/23/2019 16:53:12.523-07:00 |         0.0 |      1.0 |          1.0 |
| 07/23/2019 16:53:14.519-07:00 |         0.0 |      2.0 |          0.0 |
| 07/23/2019 16:53:16.516-07:00 |        0.25 |      3.0 |          1.0 |
| 07/23/2019 16:53:18.513-07:00 |        0.25 |      4.0 |          0.0 |
| 07/23/2019 16:53:20.526-07:00 |         0.0 |      5.0 |          1.0 |
| 07/23/2019 16:53:22.522-07:00 |        0.50 |      6.0 |          0.0 |
| 07/23/2019 16:53:24.519-07:00 |         0.5 |      7.0 |          1.0 |
| 07/23/2019 16:53:26.516-07:00 |      0.9999 |      8.0 |          0.0 |
+-------------------------------+-------------+----------+--------------+

重要注意事项:

  • 我事先不知道 CSV 有多少列。
  • 我不知道 CSV 中的列是什么类型的数据。它们可以是双精度值、十六进制值和布尔值的混合。
  • 唯一可以假设的是第一列名为“Timestamp”并包含时间戳。

有没有办法告诉 pandas 读取这个 CSV 并尝试将所有列(除了第一列)转换为浮动。如果它本身无法做到这一点,请运行一个自定义函数,该函数将获取该值并返回其数字表示,如上所述?

【问题讨论】:

  • 到目前为止你有没有尝试过?请分享您解决此问题的尝试:)

标签: python python-3.x pandas csv


【解决方案1】:

可以使用 python 中的float() 方法将表格中的十六进制、布尔值和双精度值直接转换为浮点数。

试试这个:

import pandas as pd

df = pd.read_csv("data.csv")

column_names = df.columns.tolist()
column_names.remove("Timestamp")

print(df)
print(df.dtypes)

print(type(df["DoublePoint"]))

for name in column_names:
  try:
    df[name] = df[name].astype(float)
  except ValueError:
    df[name] = df[name].apply(lambda x: float(int(x, 16)))

print(df)
print(df.dtypes)

此外,在您的输入 df 中,我看到 true/false 以小写形式出现在 2 个我认为不正确的值中。如果正确,您需要将它们更改为 True/False,就像其余值一样。

【讨论】:

  • 这看起来很干净而且很有前途,但我得到了ValueError: could not convert string to float: '0x0000000000000001'float(0x0000000000000001) 有效,float('0x0000000000000001') 无效。我认为 pandas 正在尝试这样做,因为该列被 read_csv 方法解释为字符串。
  • @Emzero 我已经编辑了我的答案。要将十六进制转换为浮点数,我们需要一个十六进制数字,但它是一个字符串。要将hex string 转换为float,我们可以先将其转换为以16 为底的int,然后再将其转换为适合您的float。
  • 这似乎也不起作用。它不断抛出相同的错误,也抛出'DataFrame' object has no attribute 'name'。不确定那些双方括号,这是故意的吗?无论如何,我已经创建了一个小提琴:repl.it/@eparizzi/Pandas-HexBool-to-Double
  • 好的,我做了一些小的调整。我正在编辑您的答案并将其标记为已接受。谢谢!
【解决方案2】:

这应该可以解决问题。

def convert_to_float(_):
    try: 
        return float((False, True)[_.lower() == "true"])
    except:
        return float(_)

converters = {_: convert_to_float for _ in pd.read_csv(filename, nrows=1).columns[1:]}

pd.read_csv(filename, converters=converters)

【讨论】:

  • 虽然 Prashant 的 astype(float) 方法更干净。
猜你喜欢
  • 2016-04-14
  • 2021-07-16
  • 2014-04-16
  • 2018-06-10
  • 2021-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多