在 Pandas DataFrame 中的列表中搜索字符串

Searching for strings in lists inside Pandas DataFrame

我正在尝试在 pandas 数据帧中包含的列表中搜索字符串,请参见以下示例:

       userAuthor     hashtagsMessage
post_1    nytimes            [#Emmys]
post_2        TMZ                  []
post_3     Forbes        [#BTSatUNGA]
post_4    nytimes            [#Emmys]
post_5     Forbes  [#BTS, #BTSatUNGA]

正如您所注意到的,承载此类列表的列是 'hashtagsMessage'。我试过使用传统的方法进行字符串搜索,但我做不到。

如果我想使用传统方法查找与“#BTS”完全匹配的内容,您可以使用其中一些选项,例如:

df['hashtagsMessage'].str.contains("#BTS", case=False)

df['hashtagsMessage']=="#BTS" 

或类似。不幸的是,这些方法不适用于列表,我必须执行一个额外的步骤,我想在 DataFrame 中搜索时在列表中建立索引,但我不确定如何执行这一部分。

非常感谢任何帮助!

您可以使用一个简单的匿名函数,该函数采用列表理解和 any() 例如:

编辑:我最初假设您想要任何标签包含“#BTS”,只是编辑以查找完全匹配的(es):)

In [10]: df = pd.DataFrame({'hashtagsMessage':[
                            [], ["#BTSatUNGA"],
                            ["#Emmys"], ['#BTS', '#BTSatUNGA']]})

In [18]: df['hashtagsMessage'].apply(lambda lst: any(s for s in lst
                                                     if s == "#BTS"))
Out[18]: 
0    False
1    False
2    False
3     True
Name: hashtagsMessage, dtype: bool

请搜索原始字符串

如果不是实际列表使用:

df['hashtagsMessage'].str.contains(r'#BTS')

如果列表请使用

df['hashtagsMessage'].astype(str).str.contains(r'#BTS')

使用mapapply:

>>> df['hashtagsMessage'].map(lambda x: '#BTS' in x)

post_1    False
post_2    False
post_3    False
post_4    False
post_5     True
Name: hashtagsMessage, dtype: bool

更新

使用explode的更可向量化的方式:

>>> df.loc[df['hashtagsMessage'].explode().eq('#BTS').loc[lambda x: x].index]

       userAuthor     hashtagsMessage
post_5     Forbes  [#BTS, #BTSatUNGA]