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.
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: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: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'
.