Как преобразовать один конкретный текстовый столбец во фрейме данных в 'utf-8', используя python3 - PullRequest
0 голосов
/ 11 марта 2020

У меня есть фрейм данных, в котором несколько столбцов и один столбец содержит записанный текст из различных ссылок. Я пытался преобразовать этот столбец в utf-8, но он не работал.

Вот мой подход:

df = pd.read_excel('data.xlsx',encoding=sys.getfilesystemencoding())
df['text'] = df['text'].apply(lambda x: x.encode('utf-8').strip())
print(df['text'])

Я получаю текст с некоторым кодом ascii:

b "b '# Спасибо, \ xe2 \ x80 \ x99s хорошо быть ...

df = pd.read_excel('data.xlsx',encoding=sys.getfilesystemencoding())
df['text'] = df['text']
print(df['text'])

Я получаю текст:

b' # Спасибо, это \ xe2 \ x80 \ x99s хорошо быть здесь ....

df['text'] = df['text'].apply(lambda x: x.decode('utf-8').strip())

AttributeError: у объекта 'str' нет атрибута 'decode'

Я пробовал 2-3 подхода, но это не помогло т работать. Любая альтернатива?

Использование Python 3.6 и ноутбука Jupyter.

1 Ответ

1 голос
/ 12 марта 2020

Предположим, что вы написали для примера, где вторая строка df['text'] = df['text'] оканчивается на '. Другими словами, b'#Thank you, it\xe2\x80\x99s good to be here....':

По какой-то причине у вас есть байт-код, который был приведен к строке, потому что вы видите AttributeError: 'str' object has no attribute 'decode', когда пытаетесь ее декодировать. (В идеале было бы лучше, если бы не попал в эту ситуацию, см. здесь , чтобы получить совет, который выглядит уместным. Увы, следуя тому, что у вас есть ...)
Я думаю, что в этом Вы можете удалить b' в начале строки и ' в конце дальнего конца и привести обратно к байтовому коду . Обратите внимание, что это приведет к тому, что обратные косые черты будут экранированы, и это необходимо решать, в дополнение к правильному декодированию байтового кода в строку. Используя подход, основанный на здесь , вы можете экранировать и декодировать байт-код.

Соедините это (вроде как @ rolf82, показанный в комментариях) с тем, что вы показываете как df['text'] , когда df['text'] = df['text'] и что это строка в начале, преобразование из того, что у вас есть, будет выглядеть так:

a = "b'#Thank you, it\xe2\x80\x99s good to be here'"
# But we only want the parts between the ''.
s = bytes(r"#Thank you, it\xe2\x80\x99s good to be here","utf-8")
import codecs
print(codecs.escape_decode(s)[0].decode("utf-8"))

Это дает:

#Thank you, it’s good to be here

Что это такое? мы хотим.

Теперь интеграция с Pandas потребует чего-то дополнительного, потому что мы не можем просто сказать, что это необработанная строка, добавив r впереди. Исходя из здесь и здесь , кажется, что использование r спереди для приведения к необработанной строке можно заменить на .encode('unicode-escape').decode(), например:

"#Thank you, it\xe2\x80\x99s good to be here".encode('unicode-escape').decode()

Поэтому, собрав все воедино, я заменил бы вашу вторую строку следующим образом:

import codecs
df['text'] = df['text'].apply(lambda x: codecs.escape_decode(bytes(x[2:-1].encode('unicode-escape').decode(), "utf-8"))[0].decode('utf-8').strip())

Если это не сработает, также попробуйте пропустить .decode() после .encode('unicode-escape'), то есть:

```python
import codecs
df['text'] = df['text'].apply(lambda x: codecs.escape_decode(bytes(x[2:-1].encode('unicode-escape'), "utf-8"))[0].decode('utf-8').strip())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...