熊猫:获取重复的索引

时间:2013-11-25 17:15:15

标签: 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

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

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

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

genome_location1    MIR3
genome_location1    AluJb
genome_location2    Tigger1
genome_location3    AT_rich

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

genome_location1    MIR3
genome_location1    AluJb

编辑:添加了玩具示例

7 个答案:

答案 0 :(得分:32)

也很有用且非常简洁:

df[df.index.duplicated()]

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

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

答案 1 :(得分:18)

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

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

重要:

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

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

没有充分的理由说明filtertransform不应该应用于非唯一索引;它起初实施得很差。

答案 2 :(得分:15)

更快更好:

df.index.get_duplicates()

答案 3 :(得分:7)

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

答案 4 :(得分:4)

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

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

答案 5 :(得分:1)

更简洁:

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

仅供参考,多指数:

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

答案 6 :(得分:-1)

这为您提供索引值以及重复行的预览

def dup_rows_index(df):
  dup = df[df.duplicated()]
  print('Duplicated index loc:',dup[dup == True ].index.tolist())
  return dup