我有以下带有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”索引进行排序?
答案 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