如何将Python Pandas DataFrame中的字母数字值转换为数值?
问题背景
以下是我的CAN总线数据DataFrame内容:
| Timestamp | CAN ID | Byte | DATA[0] | DATA[1] | DATA[2] | DATA[3] | DATA[4] | DATA[5] | DATA[6] | DATA[7] | AttackType |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1693260 | 0000 | 8.0 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | DoS Attack |
| 732574 | 0000 | 8.0 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | DoS Attack |
| 602503 | 02c0 | 8.0 | 14 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | Normal Message |
| 65525 | 0430 | 8.0 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | Normal Message |
| 1659292 | 0440 | 8.0 | ff | 00 | 00 | 00 | ff | d2 | 08 | 00 | Normal Message |
| 46083 | 0002 | 8.0 | 00 | 00 | 00 | 00 | 00 | 06 | 01 | a2 | Normal Message |
| 386324 | 0329 | 8.0 | 0c | bc | 7f | 14 | 11 | 20 | 00 | 14 | Normal Message |
| 625751 | 0130 | 8.0 | 11 | 80 | 00 | ff | 0e | 80 | 0b | e7 | Normal Message |
| 1647482 | 0002 | 8.0 | 00 | 00 | 00 | 00 | 00 | 03 | 09 | 2b | Normal Message |
| 1403442 | 0000 | 8.0 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | DoS Attack |
我的DataFrame中多数值为字母数字类型(比如02c0、ff这类十六进制字符串),请问如何将这些值中的字母转换为数值?我曾尝试将字母数字值转为NaN后删除行,但因几乎每行都包含此类值,该方法无效,恳请协助。
解决方案
1. 转换十六进制字符串为十进制数值
你的数据里CAN ID、DATA[0]到DATA[7]都是十六进制格式的字符串,直接用Python的int()函数指定base=16就能转成十进制数值,结合pandas的apply批量处理:
import pandas as pd # 假设你的DataFrame名为df hex_columns = ['CAN ID', 'DATA[0]', 'DATA[1]', 'DATA[2]', 'DATA[3]', 'DATA[4]', 'DATA[5]', 'DATA[6]', 'DATA[7]'] for col in hex_columns: df[col] = df[col].apply(lambda x: int(x, 16))
如果担心有非法的十六进制值,可以加异常处理避免报错:
def hex_to_dec(x): try: return int(x, 16) except ValueError: return x # 保留原始值,或返回NaN等自定义值 for col in hex_columns: df[col] = df[col].apply(hex_to_dec)
2. 转换分类列AttackType为数值
如果需要把AttackType也转成数值,用map函数做映射即可:
attack_map = {'Normal Message': 0, 'DoS Attack': 1} df['AttackType'] = df['AttackType'].map(attack_map)
这样处理后,所有含字母的十六进制字符串都会转为十进制数值,分类列也能转成数字,无需删除任何行。
内容的提问来源于stack exchange,提问作者Miracle Messiri
相关产品推荐
相关产品推荐

