【问题标题】:pandas str.contains match against multiple strings and get the matched valuespandas str.contains 匹配多个字符串并获取匹配的值
【发布时间】:2017-08-09 14:08:14
【问题描述】:

在下面的示例中,我能够将包含文本数据的 pandas 列与多个字符串集合进行匹配。输出只会告诉我df.col1 单元格的任何部分是否包含集合中的元素之一。它不会告诉我是哪一个!我有兴趣得到准确的信息(字符串匹配或更好的是它在集合数组中的位置)

words = ['dog', 'monkey']
pat = "|".join(map(re.escape, words))

df = pd.DataFrame({'col1':['lion bites dog','dog bites monkey','monkey bites man','man bites apple']})
df.loc[df.col1.str.contains(pat),'col1']

我需要知道集合中的哪个字符串(上面的单词)匹配的原因是集合的每个元素都可以映射到一个数值。喜欢

words_dict = {'dog':'1', 'monkey':'2'}

我也许可以尝试df.map(dict),但在实际情况下,集合存储在pandas dataframe

words_df = pd.DataFrame({1:['dog'], 2:['monkey']})

我可以想到一个相当迂回的解决方案,即迭代地检查集合中的每个元素,但如果集合中的元素数量很大,这似乎效率非常低。

编辑//

所需的输出可以是:

[0,0,1,NaN] or ['dog','dog','monkey',False]

【问题讨论】:

    标签: python regex string pandas numpy


    【解决方案1】:

    概念 1
    使用集合

    s = df.col1.str.split().apply(set)
    
    s - (s - set(words))
    
    0            {dog}
    1    {monkey, dog}
    2         {monkey}
    3               {}
    Name: col1, dtype: object
    

    概念 2
    使用str.get_dummies

    df.col1.str.get_dummies(sep=' ')[words]
    
       dog  monkey
    0    1       0
    1    1       1
    2    0       1
    3    0       0
    

    拉伸它以获得所需的结果

    d1 = df.col1.str.get_dummies(sep=' ')
    d2 = d1.loc[:, d1.columns.intersection(words)]
    d2[d2.any(1)].idxmax(1).reindex(d2.index)
    
    0       dog
    1       dog
    2    monkey
    3       NaN
    dtype: object
    

    概念 3
    使用numpy

    s = df.col1.str.split(expand=True).stack()
    a = s.values[:, None] == [words]
    
    pd.Series(np.where(a.any(1), a.argmax(1), np.nan), s.index).groupby(level=0).min()
    
    0    0.0
    1    0.0
    2    1.0
    3    NaN
    dtype: float64
    

    【讨论】:

    • 您的第三个解决方案是 esp。非常周到。
    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 2020-02-28
    • 2021-09-10
    • 1970-01-01
    • 2016-06-09
    • 2017-11-03
    • 1970-01-01
    • 2019-06-27
    相关资源
    最近更新 更多