【问题标题】:python: subsetting dataframe using multiple level index [duplicate]python:使用多级索引对数据框进行子集化
【发布时间】:2018-06-05 21:35:46
【问题描述】:

我正在尝试使用多级索引对数据框进行子集化。例如:

df = pd.DataFrame({'state': ['CA', 'WA', 'CO', 'AZ'] * 3,
                   'office_id': range(1, 7) * 2,
                   'sales': [np.random.randint(100000, 999999)
                             for _ in range(12)]})

df2=df.groupby(['state', 'office_id']).agg({'sales': 'sum'})

                  sales
state office_id        
AZ    2          839507
      4          373917
      6          347225
CA    1          798585
      3          890850
      5          454423
CO    1          819975
      3          202969
      5          614011
WA    2          163942
      4          369858
      6          959285

如您所见,df2 包含带有 state 和 office_id 的多级索引。对于 df2,我想通过使用 multiindex 找到以下数据帧的子集:

1) 仅状态 = AZ

2) 仅 office_id

3) 状态 = CA 和 office_id = 5

从历史上看,我会将索引保留在数据帧中并按列设置子集,但这效率不高。

有人可以指出我正确的方向吗?谢谢!

【问题讨论】:

    标签: python pandas dataframe indexing


    【解决方案1】:

    使用索引的基于.get_level_values 的索引,即示例

    df2.loc[(df2.index.get_level_values(0)=='AZ')]
    # Also you can specify the name i.e df2.loc[(df2.index.get_level_values('state')=='AZ')]
                     sales
    state office_id        
    AZ    2          469728
          4          398925
          6          704669
    
    df2.loc[(df2.index.get_level_values(0)=='CA') & (df2.index.get_level_values(1)<4)]
    
                      sales
    state office_id        
    CA    1          105244
          3          116514
    

    【讨论】:

      【解决方案2】:

      您也可以使用query 方法:

      由于随机数,我的 df2 有点不同:

      df2
                        sales
      state office_id        
      AZ    2          399569
            4          784863
            6          161690
      CA    1          324148
            3          631289
            5          917734
      CO    1          380714
            3          289783
            5          682802
      WA    2          941091
            4          804442
            6          379563
      

      仅亚利桑那州办事处:

      df2.query('state == "AZ"')
                        sales
      state office_id        
      AZ    2          399569
            4          784863
            6          161690
      

      仅 office id 小于 4:

      df2.query('office_id < 4')
      
                        sales
      state office_id        
      AZ    2          399569
      CA    1          324148
            3          631289
      CO    1          380714
            3          289783
      WA    2          941091
      

      加利福尼亚和办公室 id = 5

      df2.query('state == "CA" & office_id == 5')
                       sales
      state office_id        
      CA    5          917734
      

      【讨论】:

      • 您可以使用ilevel_0ilevel_1 引用未命名的索引。 Doc ref.
      • ilevel 名称仅在索引没有名称时才有效。设置df2.index.names = [None, None] 然后这个df2.query('ilevel_0 == "AZ"') 就可以了。
      • 如果您更新相同的答案会不会很好。将解决方案设为通用版本总是更好。
      • 是否也可以对数据框进行子集化以获得例如两个州(亚利桑那州和加利福尼亚州)?
      • df2.query('state in ["CA", "AZ"]')
      猜你喜欢
      • 1970-01-01
      • 2020-07-17
      • 1970-01-01
      • 2021-02-01
      • 2019-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多