使用转换函数将列值转换为浮点值

2024-09-22 16:30:30 发布

您现在位置:Python中文网/ 问答频道 /正文

给定以下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库阅读它,并获得一个数据帧,其中除第一列外,所有列都是浮动的。 对于数字,这应该是自动的,但是对于其他类型的输入,如HexPoint和BooleanPoint,我需要提供一个转换函数来将它们转换为数字

在本例中,十六进制值应转换为十进制,布尔值应将True/True转换为1,将False/False转换为0

因此,生成的数据帧应如下所示:

+-------------------------------+-------------+----------+--------------+
|           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并尝试将所有列(第一列除外)转换为float。当它无法以本机方式执行此操作时,运行一个自定义函数,该函数将获取该值并返回其数字表示形式,如上所述


Tags: csv数据函数falsetrue类型pandas数字
2条回答

可以使用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,就像其他值一样

这应该能奏效

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)

相关问题 更多 >