Python 筛选数据框单元格中包含的数据框列表值
我有一个dataframe,products`和一个包含分号分隔的标签列表的列,比如Python 筛选数据框单元格中包含的数据框列表值,python,pandas,list,filter,Python,Pandas,List,Filter,我有一个dataframe,products`和一个包含分号分隔的标签列表的列,比如 Tags ________________ tag1;tag2;tag4 tag3;tag1 tag4;tag2;tag6 ...etc 我想筛选产品,查看标签列表中是否包含Tag2 我尝试了以下方法: products["Tag2" in products["Tags"].str.split(";", expand=True)] 但是接收KeyError:False 任何提示都将不胜感激 提前感谢。更好(
Tags
________________
tag1;tag2;tag4
tag3;tag1
tag4;tag2;tag6
...etc
我想筛选产品
,查看标签列表中是否包含Tag2
我尝试了以下方法:
products["Tag2" in products["Tags"].str.split(";", expand=True)]
但是接收KeyError:False
任何提示都将不胜感激
提前感谢。更好(更聪明)的方法是使用:
df.loc[df['Tags'].str.get_dummies(';')['tag2'].eq(1)]
Tags
0 tag1;tag2;tag4
1 tag3;tag1
2 tag4;tag22;tag6
3 tag2
df.loc[df['Tags'].str.get_dummies(';')['tag2'].eq(1)]
Tags
0 tag1;tag2;tag4
3 tag2
输出:
Tags
0 tag1;tag2;tag4
她是一个涵盖所有案例的更好的例子:
数据:
df.loc[df['Tags'].str.get_dummies(';')['tag2'].eq(1)]
Tags
0 tag1;tag2;tag4
1 tag3;tag1
2 tag4;tag22;tag6
3 tag2
df.loc[df['Tags'].str.get_dummies(';')['tag2'].eq(1)]
Tags
0 tag1;tag2;tag4
3 tag2
代码:
df.loc[df['Tags'].str.get_dummies(';')['tag2'].eq(1)]
Tags
0 tag1;tag2;tag4
1 tag3;tag1
2 tag4;tag22;tag6
3 tag2
df.loc[df['Tags'].str.get_dummies(';')['tag2'].eq(1)]
Tags
0 tag1;tag2;tag4
3 tag2
输出:
df.loc[df['Tags'].str.get_dummies(';')['tag2'].eq(1)]
Tags
0 tag1;tag2;tag4
1 tag3;tag1
2 tag4;tag22;tag6
3 tag2
df.loc[df['Tags'].str.get_dummies(';')['tag2'].eq(1)]
Tags
0 tag1;tag2;tag4
3 tag2
您也可以使用:
您需要查找子字符串tag2代码>以便执行精确匹配
df.loc[(df.Tags+';').str.contains('tag2;')]
数据框中的标记列实际上包含字符串
因此,不要将这些字符串转换为列表,只需检查
每个字符串是否包含tag2:
结果(针对您的数据)是:
我认为这应该奏效:
products[products['tags'].apply(lambda x: 'tag2' in x.split(';'))]
df.Tags.str.contains('tag2')
?@harvpan,只要我正在搜索的标记不是我正在搜索的标记的子字符串,它就可以实现此目的。例如,上面将返回包含tag2和Tag22的行。签出答案。product['Tags'].str.split(';',exand=True)。eq('tag2')。任何(1)
?也想到了这一点,但@QuangHoang是非常正确的;我非常感谢你的努力however@QuangHoang说得好,我以为标签以结尾代码>马上就要编辑了。让我猜一下(df['Tags']+';')
:-)@QuangHoang如果我绝望的话,就不会使用这种方法;-)@harvpan如果tag2实际存在于数据集中,它就可以工作。不幸的是,如果数据集中不存在tag2,则此错误将通过一个KeyError:tag2
输出。我需要它不返回任何行。谢谢你的回答,但是在tag2位于列表末尾的情况下,它不起作用。。。我可以在值后面加一个分号,但似乎我检查了tag1;tag4;tag2作为第一行,它确实出现在输出中。很自然,因为第一行仍然包含tag2(当然,在末尾,但这并不重要)。