【问题标题】:Python Pandas: cannot do slice indexingPython Pandas:不能做切片索引
【发布时间】:2016-10-09 14:03:27
【问题描述】:

我正在尝试使用如下所示的 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'),所以它应该使用整数切片对吗?

此外,任何关于如何高效执行此操作的 cmets 都会很有价值,因为数据框有 1200 万行,我需要使用这种切片查询来查询它约 7000 万次。 p>

【问题讨论】:

    标签: python pandas dataframe multi-index


    【解决方案1】:

    我认为您需要在末尾添加 ,: - 这意味着您需要切片行,但需要所有列:

    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
    

    另一种解决方案是将axis=0添加到loc

    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 µs。再次感谢!
    • @jezrael,我如何从一个索引选择一个数据帧到另一个索引..在那个范围内..我有函数 users.index=np.arange(0,len(users)) 这是什么都不返回...users.loc[start:end:] 空数据框,但 users.dataframe 有内容
    猜你喜欢
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 2019-03-29
    • 2018-12-29
    • 2021-08-25
    • 2018-08-20
    • 2015-08-21
    • 1970-01-01
    相关资源
    最近更新 更多