检查字符串是否在另一列pandas中



下面是我的DF

df= pd.DataFrame({'col1': ['[7]', '[30]', '[0]', '[7]'], 'col2': ['[0%, 7%]', '[30%]', '[30%, 7%]', '[7%]']})
col1    col2    
[7]     [0%, 7%]
[30]    [30%]
[0]     [30%, 7%]
[7]     [7%]

目的是检查col1值是否包含在col2中下面是我尝试过的

df['test'] = df.apply(lambda x: str(x.col1) in str(x.col2), axis=1)

以下是预期输出

col1    col2       col3
[7]     [0%, 7%]   True
[30]    [30%]      True
[0]     [30%, 7%]  False
[7]     [7%]       True

您也可以将方括号替换为单词边界b,并像中那样使用re.search

import re
#...
df.apply(lambda x: bool(re.search(x['col1'].replace("[",r"b").replace("]",r"b"), x['col2'])), axis=1)
# => 0     True
#    1     True
#    2    False
#    3     True
#    dtype: bool

这将起作用,因为b7b将在[0%, 7%]中找到匹配项,因为7前面和后面都没有字母、数字或下划线。在[30%, 7%]中找不到任何匹配,因为b0b与数字后的零(此处为3(不匹配。

您可以提取列和join上的数字,然后使用eval+groupby+any:检查每个id是否至少有一个匹配

(df['col2'].str.extractall('(?P<col2>d+)').droplevel(1)
.join(df['col1'].str[1:-1])
.eval('col2 == col1')
.groupby(level=0).any()
)

输出:

0     True
1     True
2    False
3     True

一种方法:

import ast
# convert to integer list
col2_lst = df["col2"].str.replace("%", "").apply(ast.literal_eval)
# check list containment
df["col3"] = [all(bi in a for bi in b)  for a, b in zip(col2_lst, df["col1"].apply( ast.literal_eval)) ]
print(df)

输出

col1       col2   col3
0   [7]   [0%, 7%]   True
1  [30]      [30%]   True
2   [0]  [30%, 7%]  False
3   [7]       [7%]   True

使用Series.str.extractall获取数字,通过Series.unstack进行整形,因此可以通过DataFrame.isinDataFrame.any:进行比较

df['test'] = (df['col2'].str.extractall('(d+)')[0].unstack()
.isin(df['col1'].str.strip('[]'))
.any(axis=1))
print (df)
col1       col2   test
0   [7]   [0%, 7%]   True
1  [30]      [30%]   True
2   [0]  [30%, 7%]  False
3   [7]       [7%]   True

最新更新