Pandas中基于字符串过滤列表类型列返回空DataFrame问题求助
解决Pandas中列表类型列的字符串过滤问题
你的问题出在str.contains方法仅适用于字符串类型的列,而tags列的每个元素是列表对象,所以该方法无法识别列表中的内容,导致返回空DataFrame。
以下是几种可行的解决方案:
方法1:使用apply直接检查列表内容
最直接的方式是通过apply遍历每个列表,判断目标字符串是否存在:
df[df["tags"].apply(lambda x: "smart_home" in x)]
这个方法会逐行检查tags列的列表,返回包含目标字符串的行。
方法2:支持不区分大小写的过滤
如果需要忽略字符串大小写(比如列表中可能出现Smart_Home这类变体),可以修改判断逻辑:
df[df["tags"].apply(lambda x: any("smart_home".lower() in item.lower() for item in x))]
这里用any()配合生成器表达式,检查列表中是否有任意元素包含目标字符串(大小写统一转小写后匹配)。
方法3:通过explode展开列表后过滤
先将列表拆分为多行(每行对应一个标签),再用熟悉的str.contains过滤,最后去重还原原行:
# 展开列表为多行 df_exploded = df.explode("tags") # 过滤后去重,保留原行数据 result = df_exploded[df_exploded["tags"].str.contains("smart_home", case=False)].drop_duplicates()
这种方法适合需要对标签做更多后续处理的场景,但要注意原数据索引的唯一性。
验证结果
针对你提供的示例数据,以上方法都会筛选出包含['app', 'oflline_hub', 'smart_home']和['get_mail_mail', 'smart_home']的两行数据。
内容的提问来源于stack exchange,提问作者Tayzer Damasceno
相关产品推荐
相关产品推荐

