scipy加载ARFF转pandas DataFrame值为bytes带b前缀如何解决
现象原因
scipy.io.arff.loadarff 对ARFF格式规范中的标称型(nominal)、字符串型字段默认以二进制字节流(bytes类型)读取,不会自动按照文本编码解码为普通字符串,因此输出值会自带b'xxx'的字节类型标识,数值型字段不会出现该问题。
修复方法
方案1:手动批量解码字节列(无需额外安装依赖)
加载数据后遍历所有存储bytes类型的object列,统一做UTF-8解码即可,代码如下:
import pandas as pd from scipy.io.arff import loadarff raw_data = loadarff('/speeddating.arff') df = pd.DataFrame(raw_data[0]) # 对所有存字节内容的列做文本解码 for col in df.columns: if df[col].dtype == 'object': df[col] = df[col].str.decode('utf-8')
若解码时出现编码报错,可将
utf-8替换为latin-1重试,部分早期生成的ARFF文件可能使用非UTF-8编码。
解码完成后如果部分字段实际应为数值类型,可单独对对应列调用pd.to_numeric(df['列名'], errors='coerce')做类型转换即可。
方案2:使用自动处理类型的ARFF解析库
如果不想手动处理解码逻辑,可以使用liac-arff库加载,该库会自动将字符串类字段解析为普通文本类型:
- 先在Colab环境中安装依赖:
!pip install liac-arff - 加载数据代码:
import pandas as pd import arff with open('/speeddating.arff', 'r', encoding='utf-8') as f: raw = arff.load(f) df = pd.DataFrame(raw['data'], columns=[attr[0] for attr in raw['attributes']])
内容的提问来源于stack exchange,提问作者NaiveBae
相关产品推荐
相关产品推荐

