如何对Pandas GroupBy输出的P_0与P_1维度值进行排序?
分组结果双维度排序解决方案
你的代码执行后,分组生成的结果中P_0(行)和P_1(列)维度未按数值排序,导致P_0最小值出现在最后一行。可以通过以下两种方式实现两个维度的排序:
方法一:分组前对源数据排序
先按目标字段对数据排序,再执行分组操作,保证分组后的索引和列天然有序:
param = bta.bt_get_used_param(all_trades_df) for i in range(len(param)-1): # 按当前两个参数字段排序数据 sorted_df = lrun_trade_df.sort_values(by=[param[i], param[i+1]]) g = sorted_df.groupby([param[i], param[i+1]])['Profit'].sum().unstack(level=1) g
方法二:分组后对结果索引和列排序
直接对分组生成的DataFrame的行索引和列分别排序,无需修改源数据:
param = bta.bt_get_used_param(all_trades_df) for i in range(len(param)-1): g = lrun_trade_df.groupby([param[i], param[i+1]])['Profit'].sum().unstack(level=1) # 同时对行索引(P_0)和列(P_1)按数值排序 g = g.sort_index(axis=0).sort_index(axis=1) g
特殊情况处理
如果P_0和P_1是字符串格式的数字(如'8'、'10'),直接排序会按字典序执行(比如'10'会排在'8'前面),需要先转换为数值类型:
param = bta.bt_get_used_param(all_trades_df) for i in range(len(param)-1): # 将参数字段转为整数类型 lrun_trade_df[param[i]] = lrun_trade_df[param[i]].astype(int) lrun_trade_df[param[i+1]] = lrun_trade_df[param[i+1]].astype(int) # 再执行分组和排序 g = lrun_trade_df.groupby([param[i], param[i+1]])['Profit'].sum().unstack(level=1) g = g.sort_index(axis=0).sort_index(axis=1) g
内容的提问来源于stack exchange,提问作者gfx Prog
相关产品推荐
相关产品推荐

