在 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')
使用map
或apply
:
>>> 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]
我正在尝试在 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')
使用map
或apply
:
>>> 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]