如何批量移除Pandas DataFrame所有列中的字节串前缀b''
Pandas全列批量去除字节串前缀b''的解决方案
你尝试的代码存在两个问题:
- 先执行
df = df.astype(str)会直接把字节类型的b'stackoverflow'转为普通字符串"b'stackoverflow'",后续无法再通过decode方法处理.str是Pandas Series专属的字符串/字节处理方法,不能直接作用于整个DataFrame,执行会直接报错
方案1:通用稳妥方案(兼容存在非字节元素的场景)
逐元素判断类型,仅对字节类型内容解码,不会误伤其他类型的有效值:
df = df.applymap(lambda x: x.decode('utf-8') if isinstance(x, bytes) else x)
如果部分字节内容不是UTF-8编码,可以调整解码规则避免报错,例如:
# 忽略无法解码的字符 df = df.applymap(lambda x: x.decode('utf-8', errors='ignore') if isinstance(x, bytes) else x) # 用GBK编码解码 df = df.applymap(lambda x: x.decode('gbk') if isinstance(x, bytes) else x)
方案2:高效向量化方案(确认所有元素均为字节时使用)
对全表每列统一调用字节解码方法,大表场景下速度比逐元素处理更快:
df = df.apply(lambda col: col.str.decode('utf-8'))
补救方案:已将字节转成带b前缀字符串时的处理
如果已经执行过astype(str)把字节转成了类似"b'stackoverflow'"的普通字符串,可以用字符串裁剪的方式去除前缀和引号:
df = df.applymap(lambda x: x.lstrip("b'").rstrip("'") if isinstance(x, str) and x.startswith("b'") else x)
内容的提问来源于stack exchange,提问作者Jonnyboi
相关产品推荐
相关产品推荐

