É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é
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.
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)]
Encore plus rapide et meilleur:
df.index.get_duplicates()
>>> df[df.groupby(level=0).transform(len)['type'] > 1]
type
genome_location1 MIR3
genome_location1 AluJb
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()
Plus succinctement:
df[df.groupby(level=0).type.count() > 1]
Pour info un multi-index:
df[df.groupby(level=[0,1]).type.count() > 1]