Python Panda交叉检查子字符串并包含列之间的关系


真错误
A B C
catastrop 动物
ani 计数
cata 错误
第二行 错误
计数器
内部
时间
strong
种类

实现这一点的一种方法如下:

  • 对于a_contains_b,将Series.str.contains与由列B中的值列表组成的字符串一起使用,使用|分隔符的joined可以创建替代项(so:'animal|count|cata|rownumbers|counters|inner|time|strong|kind|membrane'(
  • 对于b_contains_a,我们希望使用Series.str.extractall,因为我们需要将结果反馈给Series.isin,以了解列A中的哪些行已经匹配。即extractall(+[0].tolist()(的结果将是['ani', 'counter'],我们将其用作df.A.isin的输入
  • 最后,我们使用这两个布尔级数作为新列的输入。使用|,因为如果任一系列都包含True,则我们需要True。将结果括在括号中,并将Series.whereSeries.notna组合应用,以覆盖列A中具有NaN值的行中的所有False
import pandas as pd
import numpy as np
data = {'A': {0: 'catastrop', 1: 'ani', 2: 'rows', 3: 'Second', 4: 'counter', 
5: 'column', 6: np.nan, 7: np.nan, 8: np.nan, 9: np.nan}, 
'B': {0: 'animal', 1: 'count', 2: 'cata', 3: 'rownumbers', 
4: 'counters', 5: 'inner', 6: 'time', 7: 'strong', 8: 'kind', 
9: 'membrane'}, 
'C': {0: True, 1: True, 2: False, 3: False, 4: True, 5: False, 
6: np.nan, 7: np.nan, 8: np.nan, 9: np.nan}}
df = pd.DataFrame(data)
a_contains_b = df.A.str.contains('|'.join(df.B.dropna().tolist()))
b_contains_a = df.A.isin(df.B.str.extractall(
'('+'|'.join(df.A.dropna().tolist()) + ')')[0].tolist())
df['D'] = (b_contains_a | a_contains_b).where(df.A.notna())
print(df)
A           B      C      D
0  catastrop      animal   True   True
1        ani       count   True   True
2       rows        cata  False  False
3     Second  rownumbers  False  False
4    counter    counters   True   True
5     column       inner  False  False
6        NaN        time    NaN    NaN
7        NaN      strong    NaN    NaN
8        NaN        kind    NaN    NaN
9        NaN    membrane    NaN    NaN

注意:如果希望匹配不区分大小写,请考虑使用Series.str.lower。在str.contains的情况下,您也可以使用参数case,并将其设置为False

最新更新