如何在Pandas中将整数错误码转为字节串并拆分至单独列?
问题:将错误码二进制位拆分到Pandas对应列
我每分钟从设备接收整数格式的错误码,该错误码代表字节串,每一位对应特定错误。为满足分析需求,需将这些位在Pandas中拆分为单独列。目前已实现将错误码转为二进制列表,但无法填充到对应列,相关信息如下:
现有代码
def converttobinary(num, length=3): binary_string_list = list(format(num, '0{}b'.format(length))) return [int(digit) for digit in binary_string_list] df = pd.DataFrame({'errorcode': [1,2,3], 'errorcodelist': ['', '', ''], 'errorcode01': ['', '', ''], 'errorcode02': ['', '', ''], 'errorcode03': ['', '', ''],}) df['errorcodelist'] = df.apply(lambda row : converttobinary(row['errorcode']), axis = 1) print(df)
当前运行结果
errorcode errorcodelist errorcode01 errorcode02 errorcode03 0 1 [0, 0, 1] 1 2 [0, 1, 0] 2 3 [0, 1, 1]
预期结果
errorcode errorcodelist errorcode01 errorcode02 errorcode03 0 1 [0, 0, 1] 1 0 0 1 2 [0, 1, 0] 0 1 0 2 3 [0, 1, 1] 0 1 1
解决方案
方法一:拆分已生成的二进制列表
利用pd.Series将errorcodelist中的列表元素拆分为多列,注意列名顺序要和二进制列表的位对应(你的列表是高位在前,所以要反向匹配列名):
def converttobinary(num, length=3): binary_string_list = list(format(num, '0{}b'.format(length))) return [int(digit) for digit in binary_string_list] df = pd.DataFrame({'errorcode': [1,2,3], 'errorcodelist': ['', '', ''], 'errorcode01': ['', '', ''], 'errorcode02': ['', '', ''], 'errorcode03': ['', '', ''],}) df['errorcodelist'] = df.apply(lambda row : converttobinary(row['errorcode']), axis = 1) # 将列表拆分为对应列:列表第0位对应errorcode03,第1位对应errorcode02,第2位对应errorcode01 df[['errorcode03', 'errorcode02', 'errorcode01']] = df['errorcodelist'].apply(pd.Series) print(df)
方法二:直接通过位运算提取(更高效)
如果不需要中间的errorcodelist列,直接用位运算提取每一位错误码,效率比生成列表再拆分更高:
import pandas as pd df = pd.DataFrame({'errorcode': [1,2,3], 'errorcode01': ['', '', ''], 'errorcode02': ['', '', ''], 'errorcode03': ['', '', ''],}) # 位运算提取每一位:&1取当前位,>>n右移n位 df['errorcode01'] = (df['errorcode'] & 1).astype(int) df['errorcode02'] = ((df['errorcode'] >> 1) & 1).astype(int) df['errorcode03'] = ((df['errorcode'] >> 2) & 1).astype(int) # 如果需要保留errorcodelist列,反向组合即可 df['errorcodelist'] = df.apply(lambda row: [row['errorcode03'], row['errorcode02'], row['errorcode01']], axis=1) print(df)
内容的提问来源于stack exchange,提问作者fxopattern
相关产品推荐
相关产品推荐

