web-dev-qa-db-fra.com

Pandas: obtenez des index dupliqués

Étant donné une trame de données, je veux obtenir les index dupliqués, qui n'ont pas de valeurs en double dans les colonnes, et voir quelles valeurs sont différentes.

Plus précisément, j'ai cette trame de données:

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

Et certains des index ont des valeurs en double dans la 9ème colonne (le type d'élément répétitif d'ADN à cet emplacement), et je veux savoir quels sont les différents types d'éléments répétitifs pour des emplacements individuels (chaque index = un emplacement du génome).

Je suppose que cela nécessitera une sorte de groupby et j'espère qu'un groupby ninja pourra m'aider.

Pour simplifier encore plus, si nous n'avons que l'index et le type de répétition,

genome_location1    MIR3
genome_location1    AluJb
genome_location2    Tigger1
genome_location3    AT_rich

Donc, la sortie, je voudrais voir tous les index en double et leurs types de répétition, en tant que tels:

genome_location1    MIR3
genome_location1    AluJb

EDIT: exemple de jouet ajouté

27
Olga Botvinnik
df.groupby(level=0).filter(lambda x: len(x) > 1)['type']

Nous avons ajouté la méthode filter pour ce type d'opération. Vous pouvez également utiliser le masquage et la transformation pour des résultats équivalents, mais c'est plus rapide et un peu plus lisible.

Important:

La méthode filter a été introduite dans la version 0.12, mais elle n'a pas fonctionné sur les DataFrames/Series avec des index non uniques. Le problème - et un problème connexe avec transform sur Series - a été corrigé pour la version 0.13, qui devrait être publiée n'importe quel jour maintenant.

De toute évidence, les index non uniques sont au cœur de cette question, je dois donc souligner que cette approche n'aidera pas tant que vous n'aurez pas pandas 0.13. En attendant, la solution de contournement transform est Sachez que si vous essayez cela sur une série avec un index non unique, cela échouera également.

Il n'y a pas de bonne raison pour que filter et transform ne soient pas appliqués aux index non uniques; il a été mal appliqué au début.

18
Dan Allan

Aussi utile et très succinct:

df[df.index.duplicated()]

Notez que cela ne renvoie qu'une des lignes dupliquées, donc pour voir toutes les lignes dupliquées, vous voudrez ceci:

df[df.index.duplicated(keep=False)]

36
Matthew

Encore plus rapide et meilleur:

df.index.get_duplicates()
16
feetwet
>>> df[df.groupby(level=0).transform(len)['type'] > 1]
                   type
genome_location1   MIR3
genome_location1  AluJb
7
Roman Pekar

Au 21/09/18 Pandas indique FutureWarning: 'get_duplicates' is deprecated and will be removed in a future release, suggérant plutôt ce qui suit:

df.index[df.index.duplicated()].unique()
5
Jwok

Plus succinctement:

df[df.groupby(level=0).type.count() > 1]

Pour info un multi-index:

df[df.groupby(level=[0,1]).type.count() > 1]
1
Fil