如何将DataFrame中二进制列的字节值列表拼接为连续十六进制字符串?
如何将DataFrame中二进制列的字节值列表拼接为连续十六进制字符串?
我完全明白你遇到的困扰——你想要的是把每个字节的数值直接转成十六进制字符串并拼接起来,结果之前的操作总是绕回原random_id字符串,这是因为你大概率不小心把字节序列解码回了原字符串,而不是直接处理每个字节的十六进制表示。
下面给你两种简洁可靠的解决方案,直接得到你想要的313233343536373839303132这样的结果:
方案一:利用bytes对象的hex()方法(最简洁高效)
Python的bytes对象自带hex()方法,可以直接把字节序列转换成连续的十六进制字符串,完美匹配你的需求。我们只需要把列表里的字节值转成bytes对象,再调用这个方法即可:
import pandas as pd # 模拟你的DataFrame结构 df = pd.DataFrame({ 'random_id': ['123456789012'], 'random_id_cesu8': [[49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50]] # 注:这里的49对应十六进制0x31(字符'1'的UTF-8字节),也就是你看到的列表显示值31 }) # 核心转换逻辑 df['concatenated_hex'] = df['random_id_cesu8'].apply(lambda x: bytes(x).hex()) # 查看结果 print(df['concatenated_hex'].iloc[0]) # 输出: 313233343536373839303132
这个方法的优势是:
- 代码极简,可读性强
- 底层是C实现,处理大规模DataFrame时性能更好
方案二:手动格式化每个字节值(更灵活,适合自定义需求)
如果你需要对十六进制格式做自定义调整(比如生成大写十六进制、添加分隔符等),可以用列表推导式逐个格式化字节值:
def byte_list_to_hex(byte_list): # 对每个字节值,格式化为两位小写十六进制字符串 return ''.join(f'{byte:02x}' for byte in byte_list) df['concatenated_hex'] = df['random_id_cesu8'].apply(byte_list_to_hex)
如果想要生成大写的十六进制字符串,只需要把02x改成02X即可,结果会变成313233343536373839303132的大写版本313233343536373839303132(每个字节的十六进制表示保持两位,字母大写)。
为什么之前的方法得到了原random_id?
你之前尝试的方法应该是类似这样的错误操作:
# 错误示例:解码字节序列回原字符串 df['wrong_result'] = df['random_id_cesu8'].apply(lambda x: bytes(x).decode('utf-8')) # 得到的是原random_id: '123456789012'
这是因为decode('utf-8')的作用是把字节序列还原成它编码的原字符串,而不是提取字节的十六进制表示——这就是你一直得到原random_id的核心原因。
备注:内容来源于stack exchange,提问作者its_niks
相关产品推荐
相关产品推荐

