Abajo está mi 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%]El objetivo es verificar si el valor de col1 está contenido en col2 a continuación, es lo que he intentado
df['test'] = df.apply(lambda x: str(x.col1) in str(x.col2), axis=1)A continuación se muestra la salida esperada
col1 col2 col3 [7] [0%, 7%] True [30] [30%] True [0] [30%, 7%] False [7] [7%] TrueUse Series.str.extractall para obtener números, remodele con Series.unstack , para que sea posible comparar con DataFrame.isin con DataFrame.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%] TruePuede extraer los números en ambas columnas y join , luego verifique si hay al menos una coincidencia por identificación usando eval + groupby + any :
(df['col2'].str.extractall('(?P<col2>\d+)').droplevel(1) .join(df['col1'].str[1:-1]) .eval('col2 == col1') .groupby(level=0).any() )producción:
0 True 1 True 2 False 3 TrueUna aproximación:
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)Producción
col1 col2 col3 0 [7] [0%, 7%] True 1 [30] [30%] True 2 [0] [30%, 7%] False 3 [7] [7%] TrueTambién puede reemplazar los corchetes con límites de palabras \b y usar re.search como en
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 Esto funcionará porque \b7\b encontrará una coincidencia en [0%, 7%] ya que 7 no va precedido ni seguido de letras, dígitos o guiones bajos. No se encontrará ninguna coincidencia en [30%, 7%] ya que \b0\b no coincide con un cero después de un dígito (aquí, 3 ).