【问题标题】:find a string from column in pandas dataframe which matches any item from another list of strings从 pandas 数据框中的列中查找与另一个字符串列表中的任何项目匹配的字符串
【发布时间】:2019-10-24 08:17:41
【问题描述】:

我有一个熊猫数据框 DF

 A                    
["I need PEN"   
["something went wrong in LAPTOP"      
"I eat MANGO"
"I dont know anything "]

还有一个 Python 列表匹配项 ["BAT","PEN","LAPTOP","I","SCHOOL",,,,]

需要添加一个与列表中的字符串匹配的新列 B

df['B']=df['A'].str.extract("(" + "|".join(matchers) + ")",expand=True)      

【问题讨论】:

  • 请编辑您的问题以包含实际内容,而不是内容图片。

标签: python string pandas


【解决方案1】:

使用str.findall,然后使用join

import pandas as pd
import re

df = pd.DataFrame({"A":["I need PEN",
                        "something went wrong in LAPTOP",
                        "I eat MANGO",
                        "I dont know anything about school"]})

matches = ["BAT","PEN","LAPTOP","I","SCHOOL"]
pattern = "|".join(f"\\b{i}\\b" for i in matches)

df["B"] = df['A'].str.findall(pattern,flags=re.IGNORECASE).str.join(",")

print (df)

#
                                   A         B
0                         I need PEN     I,PEN
1     something went wrong in LAPTOP    LAPTOP
2                        I eat MANGO         I
3  I dont know anything about school  I,school

【讨论】:

  • 我得到以下错误错误:坏字符范围 T-P
  • 上述工作与您发布的示例完全相同。如果你的样本有边缘情况,你应该包括它们。
【解决方案2】:

只需使用df.apply 函数

def fn_apply(x):
    default_list = ["BAT","PEN","LAPTOP","I","SCHOOL"]
    b_list = []
    for item in default_list:
        if item.upper() in x.A.upper().split():
            b_list.append(item)
    return ",".join(b_list)

df['B'] = df.apply(fn_apply, axis=1)
df

    A                                   B
0   I need PEN                          PEN,I
1   something went wrong in LAPTOP      LAPTOP
2   eat MANGO   
3   dont know anythingabout school      SCHOOL

让我知道这是否适合你

【讨论】:

  • 如果 x.text.upper().split() 中的 item.upper() 出现此错误:AttributeError: ("'list' object has no attribute 'upper'", 'occurred在索引 0')
  • 对不起,我更改了列名,但仍然是同样的错误
  • 列名是什么...文本?
  • 是的列名是文本
  • 你改变了很多东西。根据 SO,这并不好。请使用更改编辑您的帖子
【解决方案3】:
with easy pattern
import re
df['B'] = df['A'].str.findall('(' + '|'.join(matches) + ')', flags=re.IGNORECASE).str.join(',')

【讨论】:

  • 序列项 0:预期的 str 实例,找到列表
  • 发布完整回溯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 2019-08-30
  • 2018-07-10
  • 1970-01-01
  • 2018-03-17
相关资源
最近更新 更多