给定一个数据帧,我想获得重复的索引,这些索引在列中没有重复的值,并查看哪些值不同。
具体来说,我有这个数据框:
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
编辑:添加了玩具示例
答案 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
解决方法是可行的方法。如果您使用非唯一索引在系列上尝试,那么它也会失败。
没有充分的理由说明filter
和transform
不应该应用于非唯一索引;它起初实施得很差。
答案 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