【问题标题】:Retrieving rows by 2 indexes in a 3 MultiIndex pandas dataframe - Python3在 3 MultiIndex pandas 数据框中按 2 个索引检索行 - Python3
【发布时间】:2021-03-30 02:40:22
【问题描述】:

我有一个包含 3 个索引的多索引数据框,我需要获取前两个级别是某些元组的所有行。

我的失败尝试是

index=pd.MultiIndex.from_tuples([(1,2,"A"), (1,2,"B"), (1,3,"A"), (1,3,"B"), (10,20,"A"), (5,3,"B")], names=['first', 'second', "third"])
df=pd.DataFrame(np.random.randn(6, 2), index=index)
## Pairs of first and second level I want to retrieve
pairs=[(1,2), (5,3)]## Actually retrieved from another dataframe, but not important here
pairs=[tuple(list(pair)+[slice(None)]) for pair in pairs]
df.loc[pairs]

我收到以下错误

TypeError: unhashable type: 'slice'

但是如果我这样做 df.loc[(1,2, slice(None))] 它可以工作,但不会像 df.loc[[(1,2, slice(None)), (5,3, slice(None))]] 那样工作

我正在尽力提高效率,因为数据框 df 总是有超过 196560000 行。

我真的不知道还能做什么,我读了很多书,非常迷茫。谢谢!

编辑:

我不想检索 (1, 3)(5,2) 的组合。检索到的行应该是这样的

                           0         1                                                                                                                  
first second third                                                                                                                                      
1     2      A     -0.627749 -1.560681                                                                                                                  
             B      0.053260  0.278046                                                                                                                                                                                                                                   
5     3      B      0.197331 -0.575833 

【问题讨论】:

    标签: python-3.x pandas dataframe multi-index


    【解决方案1】:

    您可以筛选出您需要的确切行然后索引:

    pairs = [
        (1, 2),
        (5, 3),
    ] 
    

    使用列表推导式搜索索引中的特定行:

    specific_rows = [row for row in df.index if row[:2] in pairs]
    

    索引您的数据框:

    df.loc[specific_rows]
    
                                0          1
    first   second  third       
       1       2    A       1.764052    0.400157
                    B       0.978738    2.240893
       5       3    B       0.144044    1.454274
    

    【讨论】:

      【解决方案2】:

      这个技巧怎么样:

      pairs=[(1,2), (5,3)]
      df.reset_index(drop=False, level=[2]).loc[pairs].set_index("third", append=True)
      

      不是最漂亮的代码,但它会工作......

      【讨论】:

      • 天哪,它有效!我怎么没想到?我将使用我拥有的实际数据框对其进行测试,看看需要多长时间。谢谢!
      猜你喜欢
      • 2020-04-12
      • 2015-09-05
      • 2023-02-03
      • 1970-01-01
      • 2021-04-17
      • 2018-06-07
      • 2020-04-20
      • 2016-12-31
      • 2016-02-11
      相关资源
      最近更新 更多