【问题标题】:Pandas series case-insensitive matching and partial matching between valuesPandas 系列值之间不区分大小写匹配和部分匹配
【发布时间】:2017-12-12 07:00:36
【问题描述】:

我有以下操作来添加一个状态,显示一个数据框列的列中的任何字符串存在于另一个数据框的指定列中。它看起来像这样:

df_one['Status'] = np.where(df_one.A.isin(df_two.A), 'Matched','Unmatched')

如果字符串大小写不同,这将不匹配。是否可以在不区分大小写的情况下执行此操作?

另外,当 df_one.A 中的值以 df_two.A 中的完整字符串结尾时,是否可能返回“匹配”?例如df_one.A abcdefghijkl -> df_two.A ijkl = '匹配'

【问题讨论】:

  • 通常你会为此使用 str.casefold 但我猜它没有矢量化版本。相反,您可以尝试df_one['A'].str.lower().isin(df_two['A'].str.lower())

标签: python pandas numpy np


【解决方案1】:

您可以通过在表达式中将两个字符串都转换为小写或大写(都可以)来进行第一个测试(因为您没有将任一列重新分配回 DataFrame,大小写转换只是暂时的):

df_one['Status'] = np.where(df_one.A.str.lower().isin(df_two.A.str.lower()), \ 
                            'Matched', 'Unmatched')

您可以通过检查 df_one.A 中的每个字符串是否以 df_two.A 中的任何字符串结尾来执行第二个测试,如下所示(假设您仍然需要不区分大小写的匹配):

df_one['Endswith_Status'] = np.where(df_one.A.str.lower().apply( \
                                      lambda x: any(x.endswith(i) for i in df_two.A.str.lower())), \ 
                                      'Matched', 'Unmatched')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-13
    • 2022-10-12
    • 2017-11-14
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 2014-09-07
    相关资源
    最近更新 更多