es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Utilizando un bucle for para aplicar una función a cada fila en un dataframe.

Quiero ajustar mi script para que pueda usar un archivo .csv con múltiples filas como entrada en lugar de usar una fila de ejemplo. Ya he pensado en esto y creo que se puede resolver utilizando un bucle for, pero como no soy realmente hábil en el uso de los bucles for, agregué mi guion Jupyter Notebook debajo. ¡Espero que alguien pueda ayudarme con esto!

Contexto
Actualmente estoy trabajando en una tubería de código que extrae entidades quirúrgicas de notas médicas utilizando el Reconocimiento de Entidades con Nombre (NER) basado en un modelo BERT pre-entrenado, y luego utiliza el Enlazador de Entidades para obtener un tipo de cirugía (T061) del Sistema de Lenguaje Médico Unificado (UMLS, por sus siglas en inglés).

Situación actual
Actualmente tengo un script de trabajo en Jupyter Notebook que funciona para una oración de ejemplo, pero no puede analizar un archivo .csv, por ejemplo con múltiples filas en él.

Situación deseada
Quiero que este script pueda analizar un archivo .csv con múltiples filas y cada fila sea una nota médica. La salida necesaria es la fila original (nota médica) y una columna agregada que muestra ‘Sí’/’No’ según la presencia de la entidad quirúrgica en esa fila.

Script

%%capture
pip install https://s3-us-west-2.amazonaws.com/ai2-s2-scispacy/releases/v0.4.0/en_core_sci_scibert-0.4.0.tar.gz

import pandas as pd
import spacy
from scispacy.abbreviation import AbbreviationDetector
from scispacy.umls_linking import UmlsEntityLinker
from spacy import displacy

%%capture
nlp = spacy.load(“en_core_sci_scibert”)
nlp.add_pipe(“scispacy_linker”, config={“resolve_abbreviations”: True, “linker_name”: “umls”})

doc = nlp(“Atrofia muscular espinal y bulbar (AMEB) es una \
enfermedad de neuronas motoras hereditaria causada por la expansión \
de una secuencia de poliglutamina en el receptor de andrógenos (AR).\
AMEB puede ser causada fácilmente y también resuelta con una excisión. Además, el natalizumab\
causó un delirio muy fuerte. El paciente también tiene una disminución de la cognición, donde la\
puntuación MMSE es 20. El paciente tampoco es hablante nativo de holandés y tiene una barrera del lenguaje.\
El paciente vive solo.”)

linker = nlp.get_pipe(“scispacy_linker”)

entity = doc.ents[0]
concept_entity = []
all_umls_data = []
for entity in doc.ents:
print(“Nombre: “,entity)
highest_umls_ent = entity._.umls_ents[0]

concept_entity.append((highest_umls_ent[0],entity))

umls_data = linker.umls.cui_to_entity[highest_umls_ent[0]]
print(umls_data)
all_umls_data.append(umls_data)
print('\n')

umls_df = pd.DataFrame(all_umls_data)
umls_df[‘types’] = umls_df[‘types’].str[0]
df_surgery = umls_df.loc[umls_df[‘types’] == ‘T061’]
df_surgery

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución:

    Para resolver este problema, puede utilizar un ciclo for para iterar a través de cada fila en el archivo .csv. Dentro del ciclo, puede utilizar el mismo código que se menciona arriba para procesar cada fila y verificar si contiene una entidad de cirugía. Si es así, puede agregar una columna al dataframe con el valor , de lo contrario No.

    Aquí hay un ejemplo de cómo podría verse el código:


    <h1>Leer el archivo csv</h1> df = pd.read_csv('datos.csv') <h1>Crear una lista vacía para almacenar los resultados</h1> resultados = [] <h1>Iterar a través de cada fila en el dataframe</h1> for index, row in df.iterrows(): # Procesar la fila usando el mismo código mencionado arriba doc = nlp(row['nota<em>médica']) linker = nlp.get</em>pipe("scispacy<em>linker") entity = doc.ents[0] concept</em>entity = [] all<em>umls</em>data = [] for entity in doc.ents: highest<em>umls</em>ent = entity.<em>.umls</em>ents[0] concept<em>entity.append((highest</em>umls<em>ent[0],entity)) umls</em>data = linker.umls.cui<em>to</em>entity[highest<em>umls</em>ent[0]] all<em>umls</em>data.append(umls<em>data) umls</em>df = pd.DataFrame(all<em>umls</em>data) umls<em>df['tipos'] = umls</em>df['tipos'].str[0] df<em>cirugia = umls</em>df.loc[umls_df['tipos'] == 'T061'] <pre><code># Verificar si la fila contiene una entidad de cirugía if df_cirugia.empty: resultados.append('No') else: resultados.append('Sí') </code></pre> <h1>Agregar los resultados al dataframe</h1> df['entidad_cirugía'] = resultados

Comments are closed.