熊猫:获取重复的索引

Olg*_*nik 27 python indexing pandas

给定一个数据帧,我想获得重复的索引,这些索引在列中没有重复的值,并查看哪些值不同.

具体来说,我有这个数据帧:

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
Run Code Online (Sandbox Code Playgroud)

并且一些索引在第9列中具有重复值(该位置中的DNA重复元素的类型),并且我想知道各个位置的不同类型的重复元素(每个索引=基因组位置).

我猜这将需要一些groupby,希望一些groupby忍者可以帮助我.

为了进一步简化,如果我们只有索引和重复类型,

genome_location1    MIR3
genome_location1    AluJb
genome_location2    Tigger1
genome_location3    AT_rich
Run Code Online (Sandbox Code Playgroud)

所以输出我想看到所有重复索引及其重复类型,如下:

genome_location1    MIR3
genome_location1    AluJb
Run Code Online (Sandbox Code Playgroud)

编辑:添加玩具示例

Mat*_*hew 38

同样有用且非常简洁:

df[df.index.duplicated()]

请注意,这只会返回其中一个重复的行,因此要查看您想要的所有重复行:

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

  • **用法示例**: 1. `idx = pd.Index(['lama', 'cow', 'lama', 'beetle', 'lama'])` 2. `idx.​​duplicated()` 3. `数组([假,假,真,假,真])` (2认同)

Dan*_*lan 18

df.groupby(level=0).filter(lambda x: len(x) > 1)['type']
Run Code Online (Sandbox Code Playgroud)

我们filter为这种操作添加了方法.您也可以使用屏蔽和转换来获得相同的结果,但这样更快,也更具可读性.

重要:

filter方法在版本0.12中引入,但它无法在具有非唯一索引的DataFrames/Series上工作.问题 - 以及与transform系列相关的问题- 已针对0.13版修复,该版本现在应该在任何一天发布.

很明显,非唯一索引是这个问题的核心,所以我应该指出,这种方法在你拥有pandas 0.13之前无济于事.与此同时,transform解决方法是要走的路.如果你在具有非唯一索引的系列上尝试它,那么它也会失败.

有没有很好的理由filtertransform不应该适用于非唯一索引; 它起初只是执行得很差.


fee*_*wet 16

更快更好:

df.index.get_duplicates()
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案,但它附带了 pandas 0.23.4 的未来警告“get_duplicates”已弃用,并将在未来版本中删除。您可以使用 idx[idx.duplicate()].unique() 代替` (2认同)

Rom*_*kar 7

>>> df[df.groupby(level=0).transform(len)['type'] > 1]
                   type
genome_location1   MIR3
genome_location1  AluJb
Run Code Online (Sandbox Code Playgroud)

  • 或者,非常类似地,使用``filter``就像这样:``df.groupby(level = 0).filter(lambda x:len(x)> 1)['type']``.将比转换和屏蔽更快. (3认同)

Jwo*_*wok 5

从18年9月21日起,Pandas表示FutureWarning: 'get_duplicates' is deprecated and will be removed in a future release,而不是建议以下内容:

df.index[df.index.duplicated()].unique()
Run Code Online (Sandbox Code Playgroud)