Tengo una matriz cuadrada como esta.
ACSM3 ACSX12 ADXM28 ... UGT2B15 VCAN XK
ACSM3 1.000000 0.929347 0.999914 ... 0.986433 0.999947 -0.999680
ACSX12 0.929347 1.000000 0.924428 ... 0.977350 0.925496 -0.919704
ADXM28 0.999914 0.924428 1.000000 ... 0.984196 0.999996 -0.999925
ADAM28 0.999976 0.926774 0.999981 ... 0.985275 0.999994 -0.999831
ADH1B -0.999509 -0.917317 -0.999834 ... -0.980802 -0.999778 0.999982
ADTRP -0.999039 -0.912273 -0.999528 ... -0.978290 -0.999438 0.999828
AEBP1 0.983312 0.846668 0.985611 ... 0.940104 0.985133 -0.987601
AKR1B10 -0.999658 -0.919371 -0.999915 ... -0.981800 -0.999874 1.000000
UBL3 0.997347 0.900002 0.998215 ... 0.971864 0.998043 -0.998870
UGT2B15 0.986433 0.977350 0.984196 ... 1.000000 0.984690 -0.981961
VCAN 0.999947 0.925496 0.999996 ... 0.984690 1.000000 -0.999887
XK -0.999680 -0.919704 -0.999925 ... -0.981961 -0.999887 1.000000
Después de usar la función de pila, llevo los datos a la forma que quiero, pero como puede ver, hay múltiples valores para todos los datos debido a la comparación entre ellos.
dfHealty = df_healtyWithGenes.stack().reset_index()
dfHealty.columns = ['gene1', 'gene2', 'score']
dfHealty = dfHealty[dfHealty.gene1 != dfHealty.gene2]
Puedo filtrar por puntaje, pero no es una buena idea, los datos pueden estar rotos.
¿Cómo puedo filtrar por columna de genes?
gene1 gene2 score
EPB41L4B PGC 0.496713249
PGC EPB41L4B 0.496713249
CHGA MT1G 0.496751983
MT1G CHGA 0.496751983
AEBP1 FCER1G 0.497061368
FCER1G AEBP1 0.497061368
ADTRP CAPN9 0.497122603
CAPN9 ADTRP 0.497122603
FAM189A2 GLUL 0.49721763
GLUL FAM189A2 0.49721763
CA9 DUOX1 0.497233294
DUOX1 CA9 0.497233294
EDNRA MSLN 0.497267565
MSLN EDNRA 0.497267565
HRASLS2 LIPF 0.497581499
LIPF HRASLS2 0.497581499
EPB41L4B NEDD4L 0.497613643
NEDD4L EPB41L4B 0.497613643
Necesito convertir datos como este.
gene1 gene2 score
EPB41L4B PGC 0.496713249
CHGA MT1G 0.496751983
AEBP1 FCER1G 0.497061368
ADTRP CAPN9 0.497122603
FAM189A2 GLUL 0.49721763
CA9 DUOX1 0.497233294
EDNRA MSLN 0.497267565
3 respuestas
Usando los datos proporcionados, puede eliminar los pares duplicados en los datos de esta manera
import pandas as pd
cols = ['gene1','gene2','score']
data = [['EPB41L4B', 'PGC',0.496713249],
['PGC','EPB41L4B',0.496713249],
['CHGA','MT1G',0.496751983],
['MT1G','CHGA',0.496751983],
['AEBP1','FCER1G',0.497061368 ],
['FCER1G','AEBP1',0.497061368],
['ADTRP','CAPN9',0.497122603],
['CAPN9','ADTRP',0.497122603],
['FAM189A2','GLUL',0.49721763],
['GLUL','FAM189A2',0.49721763],
['CA9','DUOX1',0.497233294],
['DUOX1','CA9',0.497233294],
['EDNRA','MSLN',0.497267565],
['MSLN','EDNRA',0.497267565],
['HRASLS2','LIPF',0.497581499],
['LIPF','HRASLS2',0.497581499],
['EPB41L4B','NEDD4L',0.497613643],
['NEDD4L','EPB41L4B',0.497613643]]
df = pd.DataFrame(data,columns=cols)
df = df[df['gene1'] < df['gene2']]
print(df)
Que produce resultados como este
gene1 gene2 score
0 EPB41L4B PGC 0.496713
2 CHGA MT1G 0.496752
4 AEBP1 FCER1G 0.497061
6 ADTRP CAPN9 0.497123
8 FAM189A2 GLUL 0.497218
10 CA9 DUOX1 0.497233
12 EDNRA MSLN 0.497268
14 HRASLS2 LIPF 0.497581
16 EPB41L4B NEDD4L 0.497614
Me parece que puedes tomar cada segunda fila.
print(df.iloc[::2].reset_index(drop=True))
Salida:
gene1 gene2 score
0 EPB41L4B PGC 0.496713249
1 CHGA MT1G 0.496751983
2 AEBP1 FCER1G 0.497061368
3 ADTRP CAPN9 0.497122603
4 FAM189A2 GLUL 0.49721763
5 CA9 DUOX1 0.497233294
6 EDNRA MSLN 0.497267565
7 HRASLS2 LIPF 0.497581499
8 EPB41L4B NEDD4L 0.497613643
También puede usar frozenset
para filtrar duplicados:
without_dupes = {frozenset([first, second]): score for first, second, score in df.values}.items()
result = pd.DataFrame([(*k, v) for k, v in without_dupes], columns=['gene1', 'gene2', 'score'])
print(result)
Salida:
gene1 gene2 score
0 PGC EPB41L4B 0.496713249
1 CHGA MT1G 0.496751983
2 FCER1G AEBP1 0.497061368
3 ADTRP CAPN9 0.497122603
4 FAM189A2 GLUL 0.49721763
5 DUOX1 CA9 0.497233294
6 EDNRA MSLN 0.497267565
7 HRASLS2 LIPF 0.497581499
8 NEDD4L EPB41L4B 0.497613643
Creo que puedes hacer así. Aquí hay un ejemplo mínimo de lo que está tratando de hacer:
import pandas as pd
import numpy as np
# sample data frame
df = pd.DataFrame({'col1': ['a','b'], 'col2':['b','a'], 'col3':[1,1]})
col1 col2 col3
0 a b 1
1 b a 1
# take first two columns from where to remove duplicates
df2 = df.iloc[:,:2]
# sort the columns based on their corresponding values and create a new df
df3 = pd.DataFrame(np.sort(df2.values), axis=1), df2.index, df2.columns)
# finally drop duplicates
result = pd.concat([df3, df['col3']], axis=1).drop_duplicates(subset=['col1','col2'])
col1 col2 col3
0 a b 1
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.