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)]
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解决方法是要走的路.如果你在具有非唯一索引的系列上尝试它,那么它也会失败.
有没有很好的理由filter和transform不应该适用于非唯一索引; 它起初只是执行得很差.
fee*_*wet 16
更快更好:
df.index.get_duplicates()
Run Code Online (Sandbox Code Playgroud)
>>> df[df.groupby(level=0).transform(len)['type'] > 1]
type
genome_location1 MIR3
genome_location1 AluJb
Run Code Online (Sandbox Code Playgroud)
从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)
| 归档时间: |
|
| 查看次数: |
28889 次 |
| 最近记录: |