【问题标题】:select individual rows from multiindex pandas dataframe [duplicate]从多索引熊猫数据框中选择单个行[重复]
【发布时间】:2018-11-26 04:48:32
【问题描述】:

我正在尝试使用多索引列表从多索引数据框中选择单个行。

例如。我有以下数据框:

           Col1
A B C
1 1 1 -0.148593
    2  2.043589
  2 3 -1.696572
    4 -0.249049
2 1 5  2.012294
    6 -1.756410
  2 7  0.476035
    8 -0.531612

我想用 (A,B) = [(1,1), (2,2)] 选择所有“C”

           Col1
A B C
1 1 1 -0.148593
    2  2.043589
2 2 7  0.476035
    8 -0.531612

我有缺陷的代码如下:

import pandas as pd
import numpy as np

arrays = [np.array([1, 1, 1, 1, 2, 2, 2, 2]), np.array([1, 1, 2, 2, 1, 1, 2, 2]), np.array([1, 2, 3, 4, 5, 6, 7, 8])]
df = pd.DataFrame(np.random.randn(8), index=arrays, columns=['Col1'])
df.rename_axis(['A','B','C'], inplace=True)
print(df)

idx_lst = [(1,1), (2,2)]
test = df.loc(axis=0)[idx_lst]
print(test)

【问题讨论】:

    标签: python pandas dataframe indexing multi-index


    【解决方案1】:

    以下可能会有所帮助:

    idx_lst = [(1,1), (2,2)]
    
    df.loc(0)[[ z for z in df.index if (z[0], z[1]) in idx_lst ]]
    # Out[941]: 
    #            Col1
    # A B C          
    # 1 1 1  0.293952
    #     2  0.197045
    # 2 2 7  2.007493
    #     8  0.937420
    

    【讨论】:

      【解决方案2】:

      一种选择是使用pd.DataFrame.query

      res = df.query('((A == 1) & (B == 1)) | ((A == 2) & (B == 2))')
      
      print(res)
      
                 Col1
      A B C          
      1 1 1  0.981483
          2  0.851543
      2 2 7 -0.522760
          8 -0.332099
      

      对于更通用的解决方案,您可以使用 f-strings (Python 3.6+),它的性能应该比 str.format 或手动连接更好。

      filters = [(1,1), (2,2)]
      filterstr = '|'.join(f'(A=={i})&(B=={j})' for i, j in filters)
      res = df.query(filterstr)
      
      print(filterstr)
      
      (A==1)&(B==1)|(A==2)&(B==2)
      

      【讨论】:

        猜你喜欢
        • 2014-10-01
        • 2021-10-14
        • 2017-10-30
        • 1970-01-01
        • 2020-08-18
        • 2020-01-12
        • 2020-12-23
        • 2020-03-24
        • 2020-01-12
        相关资源
        最近更新 更多