Pandas结构包含匹配多个字符串并获得匹配值

2024-05-20 19:23:32 发布

您现在位置:Python中文网/ 问答频道 /正文

在下面的示例中,我能够将包含文本数据的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']

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

^{pr2}$

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

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

我可以想出一个相当迂回的解决方案,迭代检查集合中的每个元素,但是如果集合中的元素数量很大,那么这种方法似乎效率很低。在

编辑//

所需输出可以是:

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

Tags: 字符串元素示例mapdataframepandasdfbites
1条回答
网友
1楼 · 发布于 2024-05-20 19:23:32

概念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

^{pr2}$

将其拉伸以获得所需的结果

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

相关问题 更多 >