【问题标题】:Finding all similar values in pandas using SequenceMatcher Python使用 SequenceMatcher Python 在 pandas 中查找所有相似值
【发布时间】:2020-06-30 08:17:07
【问题描述】:

我正在尝试过滤一列中 pandas 中的特定值,但也允许输入错误。我认为使用 SequenceMatcher 是一个很好的解决方案,但我不知道在 DataFrame 中应用它的最佳方法是什么。假设标题是“数字”和“位置”。

df1 = [[1, Amsterdam], [2, amsterdam], [3, rotterdam], [4, amstrdam], [5, Berlin]]

如果我想以特定比率过滤“阿姆斯特丹”,比如说 0.6。输出大概是这样的。

df1 = [[1, Amsterdam], [2, amsterdam], [4, amstrdam]]

完成这项工作的最佳方法是什么?我正在考虑使用过滤器选项,但没有奏效。我是否需要先运行应用函数来添加具有比率的列,然后才能对其进行过滤?还是有更聪明的方法?

df2 = df1[SequenceMatcher(None, location, df1.location).ratio() > 0.6]

【问题讨论】:

    标签: python pandas apply sequencematcher


    【解决方案1】:

    您在正确的轨道上,使用 applyloc 您可以过滤 df。我已将比率设为 0.7,否则鹿特丹也会匹配。

    import difflib
    import pandas as pd
    
    df = pd.DataFrame([[1, 'Amsterdam'], [2, 'amsterdam'], [3, 'rotterdam'], [4, 'amstrdam'], [5, 'Berlin']])
    df.columns = ['number', 'location']
    
    df = df.loc[df.apply(lambda x: difflib.SequenceMatcher(None, 'Amsterdam', x.location).ratio() > 0.7, axis=1)]
    
    print(df)
    
       number   location
    0       1  Amsterdam
    1       2  amsterdam
    3       4   amstrdam
    

    【讨论】:

    • 啊,这解决了问题。谢谢你。您能否详细说明 lambda 函数在这种情况下是如何工作的?我似乎不太了解它。
    • 使用apply,您可以在数据帧的每一行 (axis=1) 或每一列 (axis=0) 上应用一个函数。 Apply 将该行传递给函数的第一个参数,在我们的例子中是 lambda 函数的 x 参数。然后 lambda 与给定城市“阿姆斯特丹”和当前行 x.location 中的位置进行序列匹配。它根据ratio > 0.7 比较返回TrueFalse。然后 loc 使用这些 True/False 值来确定要保留/过滤哪些行。
    • 啊,我明白了。 apply 函数“使用”整个 DataFrame,而 lambda 函数足够聪明,可以根据提供的轴参数将 DataFrame 分成行或列的片段。并且每个“剪切”片段都被视为传递给 SequenceMatcher 函数的 x 值。感谢您的详细说明!
    • 差不多,apply对每一行调用lambda函数(axis=1是apply的参数)。 lambda 函数只接受给定的行并返回 True 或 False,它不是“智能”。
    猜你喜欢
    • 1970-01-01
    • 2016-12-17
    • 2017-08-31
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多