我有一个熊猫数据框,具有十六进制值,如下所示:
df['col1']
<0020>
<0938>
<002E>
<092B>
<092B>
<0916>
<0915>
<0915>
<096F>
<096C>
我想将hex values
转换为其相应的unicode文字。因此,我尝试执行以下操作:
df['col1'] = df['col1'].apply(lambda x : '\u' + str(x)[1:-1])
希望,将其转换为我的必需的unicode文字,但出现以下错误:
File "<ipython-input-22-891ccdd39e79>", line 1
df['col1'].apply(lambda x : '\u' + str(x)[1:-1])
^
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-1: truncated \uXXXX escape
在python3中,当我们尝试以下操作时,我们得到:
>>> string1 = '\u03b4'
>>> print(string1)
>>> δ
因此,我尝试在给定的字符串中添加 \ u ,也尝试添加\\u
,但这显示为 两个反斜杠 < / strong>。另外,在r
之前添加\u
,也会显示两个反斜杠,而不是unicode文字。我也尝试过decode-unicode
,但是也没有用。
如果有人可以解释原始字符串, \ u 等的概念,那也很好。
答案 0 :(得分:2)
糟糕,文字是用于...文字值!一旦有了变量,就应该使用.wav
和int
之类的转换函数。
这里有一列包含字符串。对于该列中的每个单元格,您要删除第一个和最后一个字符,处理保留为十六进制值的内容,并获得具有该代码点的unicode字符。在Python中,它的内容为:
chr
根据您的值,它会给出:
df['col1'].apply(lambda x: chr(int(x[1:-1], 16)))
现在由于您的错误原因。
0
1 स
2 .
3 फ
4 फ
5 ख
6 क
7 क
8 ९
9 ६
转义序列适用于Python 解析器。当在字符串文字中找到它们时,它们将自动替换为具有该代码点的unicode字符。您可以使用\uxxxx
模块和codecs
编码对包含 actual unicode_escape
个字符的字符串进行解码(这意味着您可以像{ {1}},但是由于您直接拥有代码点的十六进制表示,因此直接使用\u
函数更简单。
在您的初始代码中,当您编写"\\uxxx"
时,解析器会看到已编码字符的初始部分,并尝试立即对其进行解码...但是在其后找不到六进制代码点,因此它将抛出例外。如果您确实想这样做,则必须将反斜杠(chr
)加倍以转义并将其原样存储在字符串中,然后使用'\u'
进行解码如@ndclt's answer中所示的字符串。但我不建议您这样做。
可在标准Python库文档,\
函数和codecs.decode(..., encoding='unicode_escape')
模块中找到参考。
答案 1 :(得分:1)
为了将您所有的代码转换为unicode,请在此处一行:
import codecs
import pandas as pd
(
# create a series with the prefix "\u" to add to the existing column
pd.Series([r'\u'] * len(df['col1']))
# str.strip deletes the "<" and ">" from your column
# str.cat concatenates the prefix created before to the existing column
.str.cat(df['col1'].str.strip('<>'))
# then you apply a conversion from the raw string to normal string.
.apply(codecs.decode, args=['unicode_escape'])
)
在前面的代码中,您必须将前缀创建为原始字符串。如果不是,则Python正在等待有效的utf-8代码(您的代码中存在错误)。
编辑:我在Serge Ballesta post
中添加了说明\ uxxxx转义序列用于Python解析器。当在字符串文字中找到它们时,它们将自动替换为具有该代码点的unicode字符。您可以使用编解码器模块和unicode_escape编码来解码包含实际\ u字符字符的字符串(这意味着您可以像在\ uxxx中那样对反斜杠进行转义,但是由于您直接拥有代码点的十六进制表示,因此可以直接使用chr函数更简单。
他的解决方案比我的解决方案更优雅。