Python Pandas:无法进行切片索引

4
我将尝试处理一个 pandas 多索引数据帧,其外观如下:
                   end ref|alt
chrom start
chr1  3000714  3000715     T|G
      3001065  3001066     G|T
      3001110  3001111     G|C
      3001131  3001132     G|A

我希望你能做到这一点:
df.loc[('chr1', slice(3000714, 3001110))]

出现以下错误:

无法使用这些索引器[1204741]对 进行切片索引

df.index.levels[1].dtype 返回 dtype('int64'),所以应该可以使用整数切片吧?

此外,关于如何高效地进行此类切片查询,任何评论都将是有价值的,因为数据帧有1200万行,我需要对其进行大约7000万次此类查询。

1个回答

7
我认为你需要在末尾添加,: - 这意味着你需要切片行,但需要所有列:
print (df.loc[('chr1', slice(3000714, 3001110)),:])
                   end ref|alt
chrom start                   
chr1  3000714  3000715     T|G
      3001065  3001066     G|T
      3001110  3001111     G|C

另一种解决方案是在loc中添加axis=0
print (df.loc(axis=0)[('chr1', slice(3000714, 3001110))])
                   end ref|alt
chrom start                   
chr1  3000714  3000715     T|G
      3001065  3001066     G|T
      3001110  3001111     G|C

但如果只需要30007143001110

print (df.loc[('chr1', [3000714, 3001110]),:])
                   end ref|alt
chrom start                   
chr1  3000714  3000715     T|G
      3001110  3001111     G|C

idx = pd.IndexSlice
print (df.loc[idx['chr1', [3000714, 3001110]],:])
                   end ref|alt
chrom start                   
chr1  3000714  3000715     T|G
      3001110  3001111     G|C

时间安排:

In [21]: %timeit (df.loc[('chr1', slice(3000714, 3001110)),:])
1000 loops, best of 3: 757 µs per loop

In [22]: %timeit (df.loc(axis=0)[('chr1', slice(3000714, 3001110))])
1000 loops, best of 3: 743 µs per loop

In [23]: %timeit (df.loc[('chr1', [3000714, 3001110]),:])
1000 loops, best of 3: 824 µs per loop

In [24]: %timeit (df.loc[pd.IndexSlice['chr1', [3000714, 3001110]],:])
The slowest run took 5.35 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 826 µs per loop

太棒了,完美地解决了问题。感谢您的详细解释。我还意识到,在我的情况下,由于第一级索引比第二级索引小得多(level[0] 索引中有23个项目,而 level[1] 索引中有1260万个项目),通过将数据框拆分为第一个索引上的字典,可以获得更大的速度提升。在我的完整数据框上,df.loc(axis=0)[('chr1', slice(3000714, 3001110))] 方法每次循环需要218毫秒,而制作字典并执行 dfs['chr1'].loc[3000714:3001110] 只需要95.7微秒。再次感谢! - Mike D
@jezrael,我该如何选择一个数据框从一个索引到另一个索引..在那个范围内..我有一个函数,users.index=np.arange(0,len(users)),但是它没有返回任何内容...users.loc[start:end:] 是一个空的数据框,但是 users.dataframe 有内容。 - Eliethesaiyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接