gpt4 book ai didi

python - pandas str.contains 匹配多个字符串并获取匹配的值

转载 作者:太空宇宙 更新时间:2023-11-04 05:11:34 25 4
gpt4 key购买 nike

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

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

拉伸(stretch)这个以获得想要的结果

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

关于python - pandas str.contains 匹配多个字符串并获取匹配的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42867311/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com