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.

Ordenar múltiples columnas de pandas y calcular el porcentaje de valores mayores que cero.

Tengo un dataframe de pandas que he combinado usando la función melt, donde cada fila representa una expresión génica de una sola célula diferente. Quiero ordenarlo por columnas de metadatos (‘ID del paciente’, ‘ID del clúster’, ‘ID del gen’) y contar cuántas células tienen un valor mayor a cero en la columna ‘value’.

Después quiero dividir eso entre el valor total de células en ese ‘ID del clúster’ dentro de ese ‘ID del paciente’. No estoy completamente seguro de cómo hacer esto. Intenté algo como:

df = df.groupby(['ID del paciente', 'ID del clúster', 'ID del gen']).size().reset_index(name='counts')

para obtener un dataframe llamado ‘df’ con el número total de células dentro de un clúster por paciente que expresan un gen. Aún necesito una forma de ordenarlos por aquellos con la columna ‘value’ mayor a cero y luego dividirlos para obtener mis valores finales.

Cuando intento algo como:

df["Cuenta > 0"]= df.groupby(['ID del paciente', 'ID del clúster', 'ID del gen'])['value'].gt(0).sum()

Obtengo un error que dice:

AttributeError: 'SeriesGroupBy' object has no attribute 'gt'

Edit: ejemplo

data = {'ID del paciente':['C100', 'C100', 'C100', 'C101', 'C102', 'C103'],
        'ID del clúster':['ID 1', 'ID 2', 'ID 2', 'ID 2', 'ID 3', 'ID4'],
        'ID del gen':['Gen 1', 'Gen 1', 'Gen 2', 'Gen 2', 'Gen 3', 'Gen 4'],
        'Valor de expresión':[0, 0, 5, 0, 20, 5]}

# Crear el DataFrame
df = pd.DataFrame(data)

# Imprimir el resultado
df

Enlace a la imagen del ejemplo

Para cada combinación de ID del paciente, ID del clúster, ID del gen, ¿cómo puedo contar la suma de ellos? ¿La suma de los valores mayores a cero en ‘value’? Dividir los dos para encontrar el % de células positivas para un ID de gen dentro de un clúster y un paciente.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para ordenar por columnas de metadatos ('Patient ID', 'Cluster ID', 'Gene ID') y contar cuántas celdas tienen un valor mayor a cero en la columna 'Expression Value', puedes utilizar el siguiente código:

    # Ordenar por columnas de metadatos
    df_sorted = df.sort_values(by=['Patient ID', 'Cluster ID', 'Gene ID'])
    
    # Contar celdas con valor mayor a cero
    df_sorted['Count Value > 0'] = (df_sorted['Expression Value'] > 0).groupby([df_sorted['Patient ID'], df_sorted['Cluster ID'], df_sorted['Gene ID']]).transform('sum')
    

    Esto crea una nueva columna llamada 'Count Value > 0' que cuenta la cantidad de celdas con un valor mayor a cero dentro de cada grupo definido por las columnas de metadatos.

    Para dividir eso por el valor total de celdas en ese 'Cluster ID' dentro de ese 'Patient ID', puedes utilizar el siguiente código:

    # Agrupar por 'Patient ID' y 'Cluster ID' para obtener el valor total de celdas
    df_grouped = df_sorted.groupby(['Patient ID', 'Cluster ID'])['Expression Value'].sum().reset_index()
    
    # Combinar con el dataframe ordenado para obtener el valor total por cada fila
    df_merged = pd.merge(df_sorted, df_grouped, on=['Patient ID', 'Cluster ID'])
    
    # Calcular el porcentaje de celdas con valor mayor a cero
    df_merged['% Value > 0'] = df_merged['Count Value > 0'] / df_merged['Expression Value_y'] * 100
    

    Esto agrupa el dataframe ordenado por 'Patient ID' y 'Cluster ID' para obtener el valor total de celdas, luego lo combina de nuevo con el dataframe ordenado para obtener el valor total por cada fila. Finalmente, calcula el porcentaje de celdas con un valor mayor a cero y crea una nueva columna llamada '%' Value > 0'.

Comments are closed.