[英]Check if pandas column contains all values from any list of lists
我有一个数据框,例如:
df = pd.DataFrame({'A': [1,2,3,4,5], 'B': ['red green blue', 'blue redorange', 'greenyellowgr','redz blue', 'redgreen 24wall']})
要匹配的列表列表:
lsts = [['red','blue'], ['green', 'yellow']]
我需要从 df 获取所有行,其中列“B”包含来自任何子列表的所有元素。 它应该同时包含(“红色”和“蓝色”)或同时包含(“绿色”和“黄色”)。 所以,输出应该看起来像
A B
0 1 red green blue
1 2 blue redorange
2 3 greenyellowgr
3 4 redz blue
执行此操作的最佳方法是什么? 谢谢。
您可以使用.str.findall
将 B 列中的字符转换为列表,然后循环lsts
以使用set.issubset
检查lst
是否是 B 列中列表的子集。最后使用np.logical_or
减少布尔列表。
import numpy as np
lsts = [['red','blue'], ['green', 'yellow']]
s = set(i for lst in lsts for i in lst)
bs = df['B'].str.findall('|'.join(s)).apply(set)
m = np.logical_or.reduce([bs.apply(set(lst).issubset) for lst in lsts])
print(df[m])
A B
0 1 red green blue
1 2 blue redorange
2 3 greenyellowgr
3 4 redz blue
您可以使用集合操作:
lsts = [['red','blue'], ['green', 'yellow']]
sets = [set(l) for l in lsts]
import re
regex = '|'.join([re.escape(w) for l in lsts for w in l])
df[[any(S.issubset(x) for S in sets) for x in df['B'].str.findall(regex)]]
输出:
A B
0 1 red green blue
1 2 blue redorange
2 3 greenyellowgr
3 4 redz blue
lsts = [['a','c'], ['b', 'd']]
sets = [set(l) for l in lsts]
df[[any(S.issubset(x) for S in sets) for x in df['B']]]
输出:
A B
0 1 a b c
1 2 a cf
2 3 bdf
3 4 az c
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.