使用isin()筛选DataFrame返回空结果,求原因及解决方法
问题原因及解决方法
核心原因
isin()方法的逻辑和你的需求不匹配:
- pandas的
isin()是用来检查列中的单个元素是否存在于你传入的列表里。如果你的Chord Notes列每个单元格存储的是列表对象(比如['C','E','G']),那df['Chord Notes'].isin(['C','E','G'])会把每个单元格的列表和传入列表里的字符串('C'、'E'、'G')逐一对比——列表和字符串是完全不同的类型,自然匹配失败,返回空DataFrame。
正确的筛选方式
根据你的需求(找Chord Notes列完全等于['C','E','G']的行),用以下方法:
- 直接相等判断
df[df['Chord Notes'] == ['C','E','G']]
这种方式严格匹配列表的元素顺序和内容,只有单元格里的列表和目标列表完全一致才会被筛选出来。
- 忽略顺序的匹配(用集合)
如果不关心列表元素的顺序,可以用集合来判断:
df[df['Chord Notes'].apply(lambda x: set(x) == set(['C','E','G']))]
注意:集合会自动去重,如果你的单元格列表有重复元素,这种方式可能会误判。
- 包含所有目标元素的匹配
如果是想找包含['C','E','G']所有元素的行(不管单元格里还有没有其他元素),可以用子集判断:
df[df['Chord Notes'].apply(lambda x: set(['C','E','G']).issubset(set(x)))]
内容的提问来源于stack exchange,提问作者Sir Roland Baggybottom IV
相关产品推荐
相关产品推荐

