Pandas中字符串类型MultiIndex的排序异常问题问询
解决Pandas MultiIndex中字符串类型Spot索引排序异常的问题
嘿,我懂你遇到的这个糟心问题!核心原因就是Spot这个索引层级是字符串类型——Pandas对字符串索引排序时会用字典序,而不是我们想要的数值大小顺序。比如字符串'101.89'会排在'33.5'前面,因为字符'1'的ASCII码比'3'小,这完全不符合我们对数值排序的预期。
下面给你两种实用的解决方案:
方案一:创建MultiIndex时直接指定数值类型
如果还没生成最终的DataFrame,最省心的方式就是在创建索引时就把Spot的字符串转成数值(比如float),这样后续排序自然就按数值大小来:
import pandas as pd import numpy as np # 把Spot的字符串值转换为float类型 spot_values = [500.50, 33.5, 109.40, 88, 101.89, 1103.18] # 生成MultiIndex时使用数值类型的Spot值 idx = pd.MultiIndex.from_product( [['USDCLP', 'USDMXN', 'USDBRL','EURUSD'], spot_values], names=['Ccy', 'Spot'] ) col = ['A', 'B', 'C'] df = pd.DataFrame(np.nan, idx, col) # 现在排序就会按Ccy分组,每组内按Spot数值升序排列 df = df.sort_index(level=['Ccy','Spot'], ascending=True) print(df)
方案二:修改已有DataFrame的索引类型
如果已经有了现成的DataFrame,不想重新构建,可以直接修改Spot层级的索引类型,再排序:
# 针对已存在的df操作 # 将Spot层级的字符串索引转换为float类型 df.index = df.index.set_levels( df.index.get_level_values('Spot').astype(float), level='Spot' ) # 重新排序 df = df.sort_index(level=['Ccy','Spot'], ascending=True) print(df)
这两种方法都能让Spot按数值大小排序,比如每个货币对下的Spot会从最小到最大排列,完全符合你的预期。
内容的提问来源于stack exchange,提问作者Gabriel
相关产品推荐
相关产品推荐

