A | B | C |
---|---|---|
大灾难 | 动物 | 真的 |
ani | count | 真 |
rows | cata | False |
第二 | 行数 | 假 |
counter | 计数器 | 真 |
列 | 内部 | 假 |
时间 | ||
强 | ||
种类 | ||
膜 |
A和B都包含字符串和子字符串,我想检查列A是否有值“counter”,并且该值是**,要么在列B中有子字符串“count”,要么是列B中“counters”的子字符串**。如果满足任意,则返回True。(类似于.isin和.str.contains的组合)。C是输出,它表示A的值是B的子字符串还是A包含B。就像catastrop包含cata,所以True,ani是animal的子字符串,所以Tru
我最初想到的代码是
list1=a1['A'].tolist()
output1=[]
for i in list1:
output1.append(any(a1['B'].str.contains(i,regex=False)))
并对列B执行或运算
但如果我做的相反,就像
list2=a1['B'].tolist()
output2=[]
for i in list2:
output2.append(any(a1['A'].str.contains(i,regex=False)))
列表2将包含关于列B而不是列A的验证结果。
我该如何编写此代码?
1条答案
按热度按时间hfyxw5xn1#
实现这一目标的一种方法如下:
a_contains_b
,将Series.str.contains
与由列B
、joined
和|
分隔符中的值列表组成的字符串一起使用,以创建替代项(因此:'animal|count|cata|rownumbers|counters|inner|time|strong|kind|membrane'
)。b_contains_a
,我们希望改用Series.str.extractall
,因为我们需要将结果反馈给Series.isin
以了解列A
中的哪些行已匹配。一、 e.extractall
(+[0].tolist()
)的结果将是['ani', 'counter']
,我们将其用作df.A.isin
的输入。|
,因为如果任何一个序列包含True
的话,我们需要True
。将结果用括号括起来,并应用Series.where
和Series.notna
组合,覆盖列A
中具有NaN
值的行中的所有False
数值。N、 B.如果希望匹配不区分大小写,请考虑使用
Series.str.lower
。在str.contains
的情况下,还可以使用参数case
,并将其设置为False
。