Фильтр pandas строк данных, содержащих не-ascii значения - PullRequest
2 голосов
/ 21 января 2020

У меня есть столбец с адресами, и я хочу найти все строки, которые содержат «чужие», то есть не-ASCII-символы.

import pandas as pd

df = pd.DataFrame.from_dict({
    'column_name': ["GREENLAND HOTEL, CENTRAL AVENUE, NAGPUR-440 018.", "Møllegade 1234567 DK-6400 Sønderborg Denmark"],
    'column_other': ["0", "1"]
})

Ожидаемый вывод - будет отображаться только 2-я строка, содержащая «ø». "персонаж.

Я пробовал это:

df['column_name'].str.isascii()

, но в Python 3.6 по крайней мере это не работает.

В MySQL я могу сделать этот эквивалент

SELECT * FROM `table_name` WHERE `column_name`!=CONVERT(`column_name` USING ASCII)

, который работает.

1 Ответ

2 голосов
/ 21 января 2020

Не уверен насчет производительности, но вы можете попробовать encode строку и ignore ошибки, а затем сравнить len закодированной строки с исходной, например:

mask_nonAscii = df.column_name.map(lambda x: len(x.encode('ascii', errors='ignore')) != len(x))
print (df[mask_nonAscii])
                                    column_name column_other
1  Møllegade 1234567 DK-6400 Sønderborg Denmark            1

РЕДАКТИРОВАТЬ: благодаря комментарию anky_91 вы также можете использовать str.len и str.encode из pandas, например:

mask_nonAscii = df['column_name'].str.len()\
                 .ne(df['column_name'].str.encode('ascii',errors = 'ignore').str.len())

хотя бы для сравнения длин is vectorize


Кроме того, я не видел никакой документации о методе в pandas.Series.str.isascii, но если вы используете python 3.7+, возможно, вы можете создать маску следующим образом:

mask_nonAscii = ~df.column_name.map(str.isascii)
...