在pandas

时间:2018-05-05 03:58:42

标签: python pandas

我有以下带有MultiIndex的pandas数据帧。

我需要先按'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 个答案:

答案 0 :(得分:1)

您可以执行两个步骤

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