Python pandas str.包含多个字符串的匹配项,并获取匹配的值
在下面的示例中,我能够将包含文本数据的pandas列与多个字符串集合进行匹配。输出只会告诉我Python pandas str.包含多个字符串的匹配项,并获取匹配的值,python,regex,string,pandas,numpy,Python,Regex,String,Pandas,Numpy,在下面的示例中,我能够将包含文本数据的pandas列与多个字符串集合进行匹配。输出只会告诉我df.col1单元格的任何部分是否包含集合中的一个元素。它不会告诉我是哪一个!我很想得到确切的结果(字符串与集合数组中的位置匹配,或者更好) 我之所以需要知道集合中的哪个字符串(上面的单词)是匹配的,是因为集合的每个元素都可以映射到一个数值。像 words_dict = {'dog':'1', 'monkey':'2'} 我也许可以尝试df.map(dict),但在实际情况中,集合存储在pandas数据
df.col1
单元格的任何部分是否包含集合中的一个元素。它不会告诉我是哪一个!我很想得到确切的结果(字符串与集合数组中的位置匹配,或者更好)
我之所以需要知道集合中的哪个字符串(上面的单词)是匹配的,是因为集合的每个元素都可以映射到一个数值。像
words_dict = {'dog':'1', 'monkey':'2'}
我也许可以尝试df.map(dict)
,但在实际情况中,集合存储在pandas数据帧中
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\u假人
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
你的第三个解决方案特别周到。
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