代码之家  ›  专栏  ›  技术社区  ›  Gabriel

在pandas中排序字符串类型的多索引

  •  0
  • Gabriel  · 技术社区  · 8 年前

    我有以下带有多索引的熊猫数据框架。

    我需要先按“Ccy”排序,然后按“Spot”排序。问题是“Spot”索引是字符串,因此无法正确排序。

    import pandas as pd
    import numpy as np
    
    idx = pd.MultiIndex.from_product([['USDCLP', 'USDMXN', 'USDBRL','EURUSD'],
                                      ['500.50', '33.5', '109.40','88','101.89','1103.18']],
                                     names=['Ccy', 'Spot'])
    col = ['A', 'B', 'C']
    
    df = pd.DataFrame(np.nan, idx, col)
    df = df.sort_index(level=['Ccy','Spot'], ascending=True)
    
    print df
    
                     A   B   C
    Ccy    Spot               
    EURUSD 101.89  NaN NaN NaN
           109.40  NaN NaN NaN
           1103.18 NaN NaN NaN
           33.5    NaN NaN NaN
           500.50  NaN NaN NaN
           88      NaN NaN NaN
    USDBRL 101.89  NaN NaN NaN
           109.40  NaN NaN NaN
           1103.18 NaN NaN NaN
           33.5    NaN NaN NaN
           500.50  NaN NaN NaN
           88      NaN NaN NaN
    USDCLP 101.89  NaN NaN NaN
           109.40  NaN NaN NaN
           1103.18 NaN NaN NaN
           33.5    NaN NaN NaN
           500.50  NaN NaN NaN
           88      NaN NaN NaN
    USDMXN 101.89  NaN NaN NaN
           109.40  NaN NaN NaN
           1103.18 NaN NaN NaN
           33.5    NaN NaN NaN
           500.50  NaN NaN NaN
           88      NaN NaN NaN
    

    我尝试先将索引转换为浮点数,然后按如下方式排序:

    df = df.index.levels[1].astype('float')
    df = df.sort_index(level=['Ccy','Spot'], ascending=True)
    

    但请给出以下错误:

    AttributeError: 'Float64Index' object has no attribute 'sort_index'
    

    如何以升序方式对“Spot”索引进行排序?

    1 回复  |  直到 8 年前
        1
  •  1
  •   BENY    8 年前

    您可以执行两个步骤

    df=df.reset_index(level=1)
    
    df.assign(Spot=df.Spot.astype(float)).set_index('Spot',append=True).sort_index()
    Out[12]: 
                     A   B   C
    Ccy    Spot               
    EURUSD 33.50   NaN NaN NaN
           88.00   NaN NaN NaN
           101.89  NaN NaN NaN
           109.40  NaN NaN NaN
           500.50  NaN NaN NaN
           1103.18 NaN NaN NaN
    USDBRL 33.50   NaN NaN NaN
           88.00   NaN NaN NaN
           101.89  NaN NaN NaN
           109.40  NaN NaN NaN
           500.50  NaN NaN NaN
           1103.18 NaN NaN NaN
    USDCLP 33.50   NaN NaN NaN
           88.00   NaN NaN NaN
           101.89  NaN NaN NaN
           109.40  NaN NaN NaN
           500.50  NaN NaN NaN
           1103.18 NaN NaN NaN
    USDMXN 33.50   NaN NaN NaN
           88.00   NaN NaN NaN
           101.89  NaN NaN NaN
           109.40  NaN NaN NaN
           500.50  NaN NaN NaN
           1103.18 NaN NaN NaN