【问题标题】:How do I check if dataframe column contains a string from another dataframe column and return adjacent cell in python pandas?如何检查数据框列是否包含来自另一个数据框列的字符串并返回 python pandas 中的相邻单元格?
【发布时间】:2020-06-22 01:39:29
【问题描述】:

我有 2 个数据框,一个包含我需要分类的一列字符串(df = 数据),另一个包含可能的类别和搜索词(df = 类别)。我想在“数据”数据框中添加一列,它会根据搜索词返回一个类别。例如:

数据:

**RepairName**
A/C is not cold
flat tyre is c
the tyre needs a repair on left side
the aircon is not cold

分类:

**Category**      **SearchTerm**
A/C               aircon
A/C               A/C
Tyre              repair
Tyre              flat

期望的结果 数据:

**RepairName**                        **Category**
A/C is not cold                         A/C
flat tyre is c                          Tyre
the tyre needs a repair on left side    Tyre
the aircon is not cold                  A/C

我已经用 apply 尝试了以下 lambda 函数。我不确定我的列引用是否在正确的位置:

data['Category'] = data['RepairName'].apply(lambda x: categories['Category'] if categories['SearchTerm'] in x else "")
data['Category'] = [categories['Category'] if categories['SearchTerm'] in data['RepairName'] else 0]

但我不断收到错误消息:

TypeError: 'in <string>' requires string as left operand, not Series

这提供了基于 SearchTerm 的类别是否存在的真/假,但是我无法返回与搜索词关联的类别:

data['containName']=data['RepairName'].str.contains('|'.join(categories['SearchTerm']),case=False)

这两者有时都有效,但并非一直有效(也许是因为我的某些搜索词不止一个词?)

data['Category'] = [
    next((c for c, k in categories.values if k in s), None) for s in data['RepairName']] 

d = dict(zip(categories['SearchTerm'], categories['Category']))
data['CategoryCheck'] = [next((d[y] for y in x.split() if y in d), None) for x in data['RepairName']]

【问题讨论】:

    标签: python pandas lambda apply isin


    【解决方案1】:

    我们先str.findall 然后map

    s=df.RepairName.str.findall('|'.join(cat.SearchTerm.tolist())).str[0].\
        map(cat.set_index('SearchTerm').Category)
    0     A/C
    1    Tyre
    2    Tyre
    3     A/C
    Name: RepairName, dtype: object
    df['Category']=s
    

    【讨论】:

    • 感谢 YOBEN_S。那返回了所有的nan。你能解释一下为什么你这样写,也许我可以倒退吗?例如,为什么是 str[0]?为什么要使用 tolist?
    【解决方案2】:

    一旦我确保我的所有列都是小写的(我还删除了连字符和括号以更好地衡量),这就会起作用:

    print("All lowercase")
    data = data.apply(lambda x: x.astype(str).str.lower())
    categories = categories.apply(lambda x: x.astype(str).str.lower())
    
    print("Remove double spacing")
    data = data.replace('\s+', ' ', regex=True)
    
    print('Remove hyphens')
    data["RepairName"] = data["RepairName"].str.replace('-', '')
    
    print('Remove brackets')
    data["RepairName"] = data["RepairName"].str.replace('(', '')
    data["RepairName"] = data["RepairName"].str.replace(')', '')
    
    data['Category'] = [
        next((c for c, k in categories.values if k in s), None) for s in data['RepairName']]
    

    【讨论】:

      猜你喜欢
      • 2017-09-12
      • 2018-08-24
      • 2022-10-15
      • 1970-01-01
      • 1970-01-01
      • 2020-05-27
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      相关资源
      最近更新 更多