2013-11-25 81 views
20

给定一个数据框,我想获得重复的索引,这些索引在列中没有重复值,并查看哪些值不同。熊猫:获取重复索引

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

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 

而且有些指标已经在第9列(DNA重复元素在此位置的类型)重复值,我想知道是什么各个位置的不同类型的重复元素(每个索引=基因组位置)。

我猜这将需要某种groupby,并希望一些groupby忍者可以帮助我。

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

genome_location1 MIR3 
genome_location1 AluJb 
genome_location2 Tigger1 
genome_location3 AT_rich 

所以输出我想看到所有重复的索引和他们的重复类型,例如:

genome_location1 MIR3 
genome_location1 AluJb 

编辑:加入玩具例如

+1

嗨,通常这是很好的做法,简化问题,尽可能创造具有输入和期望的输出玩具的例子。这样的问题的答案要快得多,对未来的读者会有用。 –

回答

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

我们为这种操作添加了filter方法。你也可以使用掩码和变换来获得相同的结果,但这样会更快,并且可读性更强。

重要:

filter方法是在0.12版本中引入的,但它未能就DataFrames /系列具有非唯一索引工作。这个问题 - 与系列上的transform有关的问题 - 为0.13版固定,该版本现在应该可以在任何一天发布。

显然,非唯一性指标是这个问题的核心,所以我应该指出,这种方法直到你拥有0.13的熊猫才会有帮助。与此同时,transform解决方法是要走的路。注意,如果你在系列上尝试使用非唯一索引,它也会失败。

为什么filtertransform不适用于非唯一索引没有很好的理由;刚开始实施时效果不佳。

+0

+1不知道过滤方法 –

+0

这一个不适合我,我甚至尝试过'df.groupby(level = 0).filter(lambda x:True)',接收'Exception:Reindexing only valid具有唯一赋值的索引对象。 –

+0

好抓!这种特殊用法遇到了v0.13修正的bug,这显然是许多用户所没有的。答案已更新。 –

7
>>> df[df.groupby(level=0).transform(len)['type'] > 1] 
        type 
genome_location1 MIR3 
genome_location1 AluJb 
+3

,或者非常类似地用''filter''就像这样:''df.groupby(level = 0).filter(lambda x:len(x)> 1)['type']''。将比变换和掩蔽更快。 –

+0

@DanAllan太棒了,可能你会添加另一个答案,OP会接受它吗? –

+0

谢谢!我会接受这个答案,因为它保证与当前版本的'pandas'一起工作。 –

1

更简洁:

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

FYI多指数:

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

也有用和非常简洁:

df[df.index.duplicated()]

请注意,这只是返回的一个重复行,以便查看所有需要的重复行:

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

7

甚至更​​快,更好:

df.index.get_duplicates()