Pandas:获取重复索引

2024-09-25 12:33:54 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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忍者的帮助。

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

genome_location1    MIR3
genome_location1    AluJb
genome_location2    Tigger1
genome_location3    AT_rich

因此,输出我希望看到所有重复索引及其重复类型,如下所示:

genome_location1    MIR3
genome_location1    AluJb

编辑:添加的玩具示例


Tags: 数据元素类型indexgenome指数altpd
3条回答
df.groupby(level=0).filter(lambda x: len(x) > 1)['type']

我们为这种操作添加了filter方法。您也可以使用掩蔽和转换来获得等效的结果,但这样做速度更快,可读性也更高一些。

重要:

0.12版引入了filter方法,但它无法处理索引不一致的数据帧/序列。这个问题——以及与系列中transform相关的一个问题——已经在0.13版本中修复,该版本现在应该随时发布。

显然,非均匀性指数是这个问题的核心,所以我应该指出,这种方法在熊猫0.13之前不会有帮助。与此同时,transform解决办法是一条路。请注意,如果在具有非均匀索引的序列上尝试此操作,它也将失败。

没有理由不将filtertransform应用于非均匀索引;它最初的实现很差。

更快更好:

df.index.get_duplicates()

同样有用且非常简洁:

df[df.index.duplicated()]

注意,这只返回一个重复行,因此要查看所有重复行,您需要:

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

相关问题 更多 >