pandas系列从十六进制转换为ascii有错误

时间:2017-02-20 04:10:51

标签: python python-3.x pandas hex

我的pandas.Series有多个str十六进制值,如:

74 ,68 ,69 ,73 ,20 ,69 ,73 ,20 ,6d ,79 ,20 ,74 ,65 ,78 ,74 ,20 ,74 ,6f ,20 ,68 ,65 ,78
00, ff, aa, dd, 11, 22, 33, 44, 55, 00, ff, aa, dd, 11, 22, 33, 44, 55    
74 ,68 ,69 ,73 ,20 ,69 ,73 ,20 ,6d ,79 ,20 ,74 ,65 ,78 ,74 ,20 ,74 ,6f ,20 ,68 ,65 ,78
74 ,68 ,69 ,73 ,20 ,69 ,73 ,20 ,6d ,79 ,20 ,74 ,65 ,78 ,74 ,20 ,74 ,6f ,20 ,68 ,65 ,78
00, ff, aa, dd, 11, 22, 33, 44, 55, 00, ff, aa, dd, 11, 22, 33, 44, 55

我正在尝试将hex转换为ascii,如:

df['value'] = df['value'].apply(lambda x: codec.decode(x, 'hex')

我收到的错误如下:

binascii.Error: decoding with 'hex' codec failed (Error: Odd-length string)    

我预计某些行会出现这些错误,但需要更改可转换为转换状态的值。如果出现错误,我怎么能对系列的价值无效呢?

预期产出:

this is my text to hex
00, ff, aa, dd, 11, 22, 33, 44, 55, 00, ff, aa, dd, 11, 22, 33, 44, 55
this is my text to hex
this is my text to hex
00, ff, aa, dd, 11, 22, 33, 44, 55, 00, ff, aa, dd, 11, 22, 33, 44, 55

2 个答案:

答案 0 :(得分:3)

如果您想提供自己的转换器以允许它响应错误,您可以提供一个函数而不是lambda。您对如何处理超出范围值的要求并不十分清楚,因此我将只展示一个基本示例:

def my_ascii_convert(char):
    value = int(char, 16)
    if 32 <= value < 128:
        return chr(value)
    else:
        return char

df['value'] = df['value'].apply(my_ascii_convert)

答案 1 :(得分:1)

使用int()要简单得多

def fn(foo):
    return int(foo, 16)

data = pd.Series(['74', '68', '69', '6d'])
data.apply(fn)