繁体   English   中英

检查 pandas 列是否包含任何列表列表中的所有值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM