如何按分箱列对Pandas DataFrame进行升序排序?
Pandas按区间列升序排序解决方案
问题场景
现有如下Pandas DataFrame,col1列是字符串格式的数值区间,需要按区间的逻辑顺序(从小到大)对DataFrame进行升序排序:
import pandas as pd ds = {'col1' : ['(-9999999, 550.0]','(13700.0, 23700.0]','(23700.0, 414580.0]','(4000.0, 8000.0]','(414580.0, 9999999]','(550.0, 4000.0]','(8000.0, 13700.0]'], 'col2' : [905317.3, 606156.5, 586349.6, 665779.1, 0, 803824.4, 628475.2]} df = pd.DataFrame(data=ds)
直接使用df.sort_values('col1')会按字符串字典序排序,得到错误的区间顺序,需要实现按区间的逻辑升序排列。
解决方案
方法1:通过临时列提取边界排序
提取每个区间的左边界数值作为排序依据,完成排序后删除临时列:
# 提取区间左边界 df['left_bound'] = df['col1'].apply(lambda x: float(x.split(',')[0].strip('('))) # 按左边界升序排序,重置索引 sorted_df = df.sort_values('left_bound').drop('left_bound', axis=1).reset_index(drop=True) print(sorted_df)
方法2:直接使用sort_values的key参数(更简洁)
无需创建临时列,直接在排序时指定处理逻辑:
sorted_df = df.sort_values( by='col1', key=lambda x: x.apply(lambda s: float(s.split(',')[0].strip('('))) ).reset_index(drop=True) print(sorted_df)
运行结果
两种方法都会得到符合预期的排序结果:
col1 col2 0 (-9999999, 550.0] 905317.3 1 (550.0, 4000.0] 803824.4 2 (4000.0, 8000.0] 665779.1 3 (8000.0, 13700.0] 628475.2 4 (13700.0, 23700.0] 606156.5 5 (23700.0, 414580.0] 586349.6 6 (414580.0, 9999999] 0.0
内容的提问来源于stack exchange,提问作者Giampaolo Levorato
相关产品推荐
相关产品推荐

