pandas str.contains 匹配多个字符串并获取匹配的值
Posted
技术标签:
【中文标题】pandas str.contains 匹配多个字符串并获取匹配的值【英文标题】:pandas str.contains match against multiple strings and get the matched values 【发布时间】: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]
【问题讨论】:
【参考方案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。非常周到。以上是关于pandas str.contains 匹配多个字符串并获取匹配的值的主要内容,如果未能解决你的问题,请参考以下文章
使用带有 python/pandas 的 dict 理解与 str.contains 进行部分字符串匹配
Pandas str.contains 用于部分字符串的精确匹配
如何在 Pandas 中向 .str.contains 添加多个字符串? [复制]
映射 str.contains 跨 pandas DataFrame