如何基于pd.cut生成的温度范围列对DataFrame排序?
问题:提取温度范围最小值并按指定顺序排序
我有一个大型DataFrame,已通过pd.cut创建温度范围列temp_range,需要提取该列的最小值并以此对DataFrame排序。当前提取最小值的代码存在问题,结果不符合预期,需修正后实现按'-60-50'、'-10-0'、'0-10'、'20-30'的顺序排序。
错误代码及结果
错误示例代码
# 目标:按'temp_range'列排序,顺序为'-60-50','-10-0','0-10','20-30' xdf = pd.DataFrame(data={'temp_range':['-10-0','20-30','-60-50','0-10']}) xdf['Min. temp range']= xdf['temp_range'].apply(lambda x:x[:3]) xdf
当前错误结果
| temp_range | Min. temp range |
|---|---|
| -10-0 | -10 |
| 20-30 | 20- |
| -60-50 | -60 |
| 0-10 | 0-1 |
期望结果及排序效果
期望的最小值提取结果
| temp_range | Min. temp range |
|---|---|
| -10-0 | -10 |
| 20-30 | 20 |
| -60-50 | -60 |
| 0-10 | 0 |
目标排序效果
排序后DataFrame应呈现以下顺序:
| temp_range | Min. temp range |
|---|---|
| -60-50 | -60 |
| -10-0 | -10 |
| 0-10 | 0 |
| 20-30 | 20 |
修正方案
原代码用x[:3]固定截取前3个字符,无法适配不同长度的温度范围字符串(如正数区间20-30、0-10)。推荐使用正则表达式提取左侧边界数字,这种方法更通用,能兼容负数和正数区间:
修正后的代码
import pandas as pd xdf = pd.DataFrame(data={'temp_range':['-10-0','20-30','-60-50','0-10']}) # 用正则提取开头的整数(包含负号),并转为数值类型 xdf['Min. temp range'] = xdf['temp_range'].str.extract(r'^(-?\d+)').astype(int) # 按最小值列排序 xdf_sorted = xdf.sort_values('Min. temp range') print(xdf_sorted)
代码说明
str.extract(r'^(-?\d+)'):正则表达式匹配字符串开头的整数,-?表示可选的负号,\d+表示一个或多个数字,确保准确提取温度范围的最小值。astype(int):将提取的字符串转为整数类型,保证排序时按数值大小而非字符串字典序排列。
内容的提问来源于stack exchange,提问作者Mainland
相关产品推荐
相关产品推荐

