python - quitar - Pandas: Obtenga índices duplicados
unique data frame pandas (5)
Aún más rápido y mejor:
df.index.get_duplicates()
Dado un marco de datos, quiero obtener los índices duplicados, que no tienen valores duplicados en las columnas, y ver qué valores son diferentes.
Específicamente, tengo este marco de datos:
import pandas as pd
wget https://www.dropbox.com/s/vmimze2g4lt4ud3/alt_exon_repeatmasker_intersect.bed
alt_exon_repeatmasker = pd.read_table(''alt_exon_repeatmasker_intersect.bed'', header=None, index_col=3)
In [74]: alt_exon_repeatmasker.index.is_unique
Out[74]: False
Y algunos de los índices tienen valores duplicados en la novena columna (el tipo de elemento repetitivo de ADN en esta ubicación), y quiero saber cuáles son los diferentes tipos de elementos repetitivos para ubicaciones individuales (cada índice = una ubicación del genoma).
Supongo que esto requerirá algún tipo de groupby
y espero que algún groupby
ninja pueda ayudarme.
Para simplificar aún más, si solo tenemos el índice y el tipo de repetición,
genome_location1 MIR3
genome_location1 AluJb
genome_location2 Tigger1
genome_location3 AT_rich
Entonces, el resultado que me gustaría ver es el de todos los índices duplicados y sus tipos de repetición, como tales:
genome_location1 MIR3
genome_location1 AluJb
EDITAR: ejemplo de juguete agregado
Más sucintamente:
df[df.groupby(level=0).type.count() > 1]
FYI un multi-índice:
df[df.groupby(level=[0,1]).type.count() > 1]
También es útil y muy sucinto:
df[df.index.duplicated()]
Tenga en cuenta que esto solo devuelve una de las filas duplicadas, por lo que para ver todas las filas duplicadas, querrá esto:
df[df.index.duplicated(keep=False)]
>>> df[df.groupby(level=0).transform(len)[''type''] > 1]
type
genome_location1 MIR3
genome_location1 AluJb
df.groupby(level=0).filter(lambda x: len(x) > 1)[''type'']
filter
método de filter
para este tipo de operación. También puede usar el enmascaramiento y la transformación para obtener resultados equivalentes, pero esto es más rápido y también un poco más legible.
Importante:
El método de filter
se introdujo en la versión 0.12, pero no funcionó en DataFrames / Series con índices no únicos. El problema, y un problema relacionado con transform
on Series, se corrigió con la versión 0.13, que debería lanzarse en cualquier momento.
Claramente, los índices no únicos son el corazón de esta pregunta, así que debo señalar que este enfoque no ayudará hasta que tenga pandas 0.13. Mientras tanto, la solución de transform
es el camino a seguir. Tenga en cuenta que si prueba eso en una serie con un índice no único, también fallará.
No hay una buena razón por la cual el filter
y la transform
no se deben aplicar a índices no únicos; al principio solo se implementó pobremente.