Tengo el siguiente marco de datos
col1 col2
0 str9 val1
1 str8 val2
2 str4 val3
3 str2 val4
4 unknown1 asdvstr1df
5 random1 teststr2test
y la siguiente lista
strings = ['str1', 'str2', 'str3', 'str4']
Quiero reemplazar el valor en la columna 1 si hay una coincidencia en cualquier punto de la cadena en la columna dos con la lista dada, cadenas.
Nota: col2 puede tener los valores de la lista 'cadena' dentro de la cadena, o también en cualquier extremo.
Actualmente estoy haciendo esto con un bucle anidado lento y feo:
import pandas as pd
data_file = pd.DataFrame(data = ([['str9', 'val1'], ['str8', 'val2'], ['str4','val3'] , ['str2', 'val4'] , ['unknown', 'asdvstr1df'] , ['unknown', 'teststr2test']] ), columns = (['col1', 'col2']), dtype = str)
strings = ['str1', 'str2', 'str3', 'str4']
for value in range(data_file.shape[0]):
for text in strings:
if (str(data_file.col2[value]).find(text) != -1):
data_file.loc[value, 'col1'] = text
No estoy seguro de cómo mejorar este lento proceso. ¿Cómo puedo hacer que esto se ejecute más rápido que el tiempo actual de O (nm) (n es el tamaño del archivo de datos, m es el tamaño de la lista llamada cadenas)?
La salida debe ser:
col1 col2
0 str9 val1
1 str8 val2
2 str4 val3
3 str2 val4
4 str1 asdvstr1df
5 str2 teststr2test
Damon;
x = '(' + '|'.join(strings)+ ')'
df.assign(col1 = df.col2.str.extract(x, expand=False).combine_first(df.col1))
Salida:
col1 col2
0 str9 val1
1 str8 val2
2 str4 val3
3 str2 val4
4 str1 asdvstr1df
5 str2 teststr2test
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras