给出以下数据
我希望选择num
中list
出现的行。在这种情况下,它将选择第1行和第2行,未选择第3行,因为在3
中找不到[4,5]
。
下面是数据框,我们应该如何编写过滤查询?
cat1=pd.DataFrame({"num":[1,2,3],
"list":[[1,2,3],[3,2],[4,5]]})
答案 0 :(得分:4)
将列表理解的一种可能解决方案zip
和in
传递给boolean indexing
:
df = cat1[[a in b for a, b in zip(cat1.num, cat1.list)]]
或者将DataFrame.apply
与axis=1
一起用于每行处理的解决方案:
df = cat1[cat1.apply(lambda x: x.num in x.list, axis=1)]
或创建DataFrame
并测试成员资格:
df = cat1[pd.DataFrame(cat1.list.tolist()).isin(cat1.num).any(axis=1)]
print (df)
num list
0 1 [1, 2, 3]
1 2 [3, 2]
答案 1 :(得分:1)
如果您使用的是熊猫.25
,则使用另一种解决方案:explode()
:
cat1[cat1['num'].isin(cat1.explode('list1').query("num==list1").loc[:,'num'])]
num list1
0 1 [1, 2, 3]
1 2 [3, 2]