我有一个如下的数据框:

  type     value
  hex      "6d,79,20,6e,61,6d,65,20,69,73,20,6a,6f,68,6e,0a"
  name     john
  dynamic  12
  action   encroach
  hex_2    "4d,69,6e,65,20,69,73,20,73,61,75,6c,2c,20,6e,69,63,65,20,74,6f,20,6d,65,65,74,20,79,6f,75,2e,20"
  hex      "4d,79,20,6e,61,6d,65,20,69,73,20,4d,61,74,74"
  name     Matt
  dynamic  91
  action   penalty
  hex_2   "49,20,61,6d,20,61,6e,20,65,6e,63,6f,64,65,64,20,6d,65,73,73,61,67,65,20,74,68,61,74,20,49,20,68,61,76,65,20,74,6f,20,6b,65,65,70,20,69,6e,74,65,72,6e,61,6c,20,74,6f,20,6d,79,20,6f,72,67,61,6e,69,7a,61,74,69,6f,6e,2e,20"


如何有条件地将hex和hex_2重新格式化为ASCII?

当前代码如下,通过函数调用将十六进制转换为ascii:

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

Current Failed attempt at converting:
print(df[df['type'].str.contains('hex|hex_2').apply(lambda x: ascii_convert(x)))


预期产量:

  type     value
  hex      my name is john      # converted
  name     john                 # Untouched
  dynamic  12                   # Untouched
  action   encroach             # Untouched
  hex_2    Mine is saul, nice to meet you.  # converted
  hex      My name is Matt      # converted
  name     Matt                 # Untouched
  dynamic  91                   # Untouched
  action   penalty              # Untouched
  hex_2    I am an encoded message that I have to keep internal to my organization.   # converted


我知道转换功能适用于字符,但是在我的特定条件下无法使用该功能。我的数据类型标签可以有5或6个不同的标签,我希望将它们从十六进制转换为asi,例如hex和hex_2。

任何帮助都将是惊人的。谢谢。

最佳答案

尝试失败,因为使用str.contains('hex|hex_2')试图匹配确切的字符串'hex | hex_2'。但不存在使用该名称的列。

相反,由于您已确认要转换的所有列的名称中都应包含字符串“ hex”,因此应该这样做。

 data["value"] = df.apply(lambda x: convert_ascii(x["value"]) \
 if 'hex' in x["type"] else x["value"], axis=1)


这将在type列中选择带有'hex'的行的值并将其转换,而其他列保持不变

这是一个例子:

  one  two labels
0  70  1      o
1  67  0      b
2  57  1      o
3  64  1      b
4  74  0      o
5  65  1      b
6  56  1      o
7  59  1      b
8  60  1      o
9  63  0      b


应用功能并更新标签列:

data["type"] = data.apply(lambda x: x["labels"] *4 \
               if x["one"] >= 60 else x["labels"], axis=1)

   one  two labels
0   70    1   oooo
1   67    0   bbbb
2   57    1      o
3   64    1   bbbb
4   74    0   oooo
5   65    1   bbbb
6   56    1      o
7   59    1      b
8   60    1   oooo
9   63    0   bbbb

关于python - 将包含十六进制行的多类型系列转换为ASCII,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42743602/

10-12 15:53