【问题标题】:Filter pandas dataframe rows containing non-ascii values过滤包含非 ascii 值的 pandas 数据帧行
【发布时间】:2020-01-21 02:40:11
【问题描述】:

我有一列包含地址,并且想要查找所有包含“外来”(即非 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"]
})

预期的输出是它将仅显示包含“ø”字符的第二行。

我试过了:

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

但至少在 Python 3.6 中这是行不通的。

在 MySQL 中我可以做到这一点

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

哪个有效。

【问题讨论】:

  • @anky_91 很棒的建议。我添加了一个测试用例数据框,其中一行应该匹配,另一行不应该匹配。

标签: python pandas dataframe python-3.6 non-ascii-characters


【解决方案1】:

不确定性能,但您可以尝试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 的评论,您还可以使用来自 pandas 的 str.len 和 str.encode,例如:

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

至少长度之间的比较是向量化的


另外,我没有在pandas.Series.str.isascii 中看到任何有关方法的文档,但是如果您使用python 3.7+,也许您可​​以通过这种方式创建掩码:

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

【讨论】:

    猜你喜欢
    • 2016-03-18
    • 2015-12-13
    • 2016-12-20
    • 2019-01-06
    • 1970-01-01
    • 2021-09-08
    • 2019-08-17
    • 2019-11-21
    • 1970-01-01
    相关资源
    最近更新 更多