【问题标题】:Select only one index of multiindex DataFrame只选择多索引DataFrame的一个索引
【发布时间】:2015-03-24 07:32:20
【问题描述】:

我正在尝试仅使用来自多索引 DataFrame 的一个索引来创建一个新的 DataFrame。

                   A         B         C
first second                              
bar   one     0.895717  0.410835 -1.413681
      two     0.805244  0.813850  1.607920
baz   one    -1.206412  0.132003  1.024180
      two     2.565646 -0.827317  0.569605
foo   one     1.431256 -0.076467  0.875906
      two     1.340309 -1.187678 -2.211372
qux   one    -1.170299  1.130127  0.974466
      two    -0.226169 -1.436737 -2.006747

理想情况下,我想要这样的东西:

In: df.ix[level="first"]

和:

Out:

               A         B         C
first                               
bar        0.895717  0.410835 -1.413681
           0.805244  0.813850  1.607920
baz       -1.206412  0.132003  1.024180
           2.565646 -0.827317  0.569605
foo        1.431256 -0.076467  0.875906
           1.340309 -1.187678 -2.211372
qux       -1.170299  1.130127  0.974466
          -0.226169 -1.436737 -2.006747
`

基本上我想删除除级别first 之外的多索引的所有其他索引。有没有简单的方法可以做到这一点?

【问题讨论】:

    标签: python pandas select dataframe indexing


    【解决方案1】:

    一种方法是简单地将df.index 重新绑定到所需的MultiIndex 级别。您可以通过指定要保留的标签名称来做到这一点:

    df.index = df.index.get_level_values('first')
    

    或使用关卡的整数值:

    df.index = df.index.get_level_values(0)
    

    MultiIndex 的所有其他级别都将在此处消失。

    【解决方案2】:

    解决方案相当新,使用df.xs 函数作为

    In [88]: df.xs('bar', level='first')
    Out[88]:
    Second  Third
    one     A       -2.315312
            B        0.497769
            C        0.108523
    two     A       -0.778303
            B       -1.555389
            C       -2.625022
    dtype: float64
    

    也可以使用多个索引作为

    In [89]: df.xs(('bar', 'A'), level=('First', 'Third'))
    Out[89]:
    Second
    one   -2.315312
    two   -0.778303
    dtype: float64
    

    示例的设置如下

    import pandas as pd
    import numpy as np
    arrays = [
        np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']),
        np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'])
    ]
    index = pd.MultiIndex.from_tuples(list(zip(*arrays)), names=['first', 'second'])
    df = pd.DataFrame(np.random.randn(3, 8), index=['A', 'B', 'C'], columns=index)
    df.index.names = pd.core.indexes.frozen.FrozenList(['First', 'Second', 'Third'])
    df = df.unstack()
    

    【讨论】:

      【解决方案3】:

      我使用 get_level_values(0) 来获取多索引组中的第一级索引,以构建一个包含聚合值和编码值的描述字典值的数据帧。我通过

      获得组中“airline_enc”值的索引
      def getAirlineByGrouped(grouped,dictGeneric):
          mylist=[]
          for key in grouped.index.get_level_values(0):
              item=dictGeneric.get(key)
              mylist.append(item)
          return mylist
      
      encoder=LabelEncoder()
      df['airline_enc']=encoder.fit_transform(df['airline'])
      
      dictAirline=   df[['airline_enc','airline']].set_index('airline_enc').to_dict()
      grouped=results.groupby(['airline_enc','rating'])['recommended'].count()
      
      #print(grouped)
      airlines=getAirlineByGrouped(grouped, dictAirline['airline'])
      
      result_df=pd.DataFrame({'index': grouped.index.get_level_values(0),'value':grouped.values,'airline':airlines})
      result_df.plot(x='airline',y='value')
      plt.xticks(rotation=90)
      

      【讨论】:

        猜你喜欢
        • 2014-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-08
        • 2017-08-27
        • 2016-02-17
        • 2018-04-08
        相关资源
        最近更新 更多