【问题标题】:Assign value to new column if substring from a list appears in string如果列表中的子字符串出现在字符串中,则为新列赋值
【发布时间】:2020-04-13 15:57:35
【问题描述】:

我有一个数据框 df:

tags
"a,b,c,d"
"c,q,k,t"

以及我需要搜索的字符串列表:

searchList =  ["a", "b"]

我需要在名为“topic”的数据框中添加一个新列。 如果 searchList 中的字符串出现在“tags”列中,我需要将该行中的值设置为 bool True,否则为 bool False。

结果:

tags      | topic
"a,b,c,d" | True
"c,q,k,t" | False

到目前为止我的代码:

searchList =  ["a", "b"]
pattern = '|'.join(searchfor)
df["topic"] = df.loc[(df["tags"].str.contains('|'.join(pattern), na=False)), True] = True

但我得到了错误:

KeyError: 'cannot use a single bool to index into setitem'

?

【问题讨论】:

    标签: pandas list substring assign


    【解决方案1】:

    您可以将掩码分配给新列,也可以将pattern 更改为searchList

    searchList =  ["a", "b"]
    df["topic"] = df["tags"].str.contains('|'.join(searchList), na=False)
    print (df)
          tags  topic
    0  a,b,c,d   True
    1  c,q,k,t  False
    

    编辑:

    searchList =  ["a", "b"]
    df["topic"] = df["tags"].str.split(',', expand=True).isin(searchList).sum(axis=1).eq(2)
    print (df)
          tags  topic
    0  a,b,c,d   True
    1  c,q,k,t  False
    2    a,c,d  False
    

    详情

    首先将Series.str.splitexpand=True 一起用于新的DataFrame

    print (df["tags"].str.split(',', expand=True))
       0  1  2     3
    0  a  b  c     d
    1  c  q  k     t
    2  a  c  d  None
    

    然后通过DataFrame.isin 比较会员资格:

    print (df["tags"].str.split(',', expand=True).isin(searchList))
           0      1      2      3
    0   True   True  False  False
    1  False  False  False  False
    2   True  False  False  False
    

    并按sum 计算Trues 值:

    print (df["tags"].str.split(',', expand=True).isin(searchList).sum(axis=1))
    0    2
    1    0
    2    1
    dtype: int64
    

    最后比较 Series.eq, == 的掩码。

    【讨论】:

    • 谢谢。我可以设置列表变量必须出现的最小数量吗?所以 "a,b,c" = True(包含列表中的 2 个值)但 "a,c,d" = False(仅包含列表中的 1 个值?
    猜你喜欢
    • 2021-06-25
    • 1970-01-01
    • 2021-12-31
    • 2020-03-24
    • 1970-01-01
    • 2017-11-27
    • 2023-03-28
    • 2016-04-16
    • 1970-01-01
    相关资源
    最近更新 更多