You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Pandas的字符串型数值范围列匹配问题(新手求助)

解决植株高度/冠幅范围匹配的问题

嘿,刚学6周Python就能做这么实用的植物选购项目,真的很棒!针对你遇到的字符串范围转数值、匹配用户描述性选项的问题,我给你梳理出一套能完美衔接现有代码的解决方案:

第一步:把字符串格式的范围转换成数值列

DataFrame里的height/spread列是'1.00 to 2.00 feet'这种字符串,我们需要提取出其中的最小和最大值,转换成可计算的float类型。这里用正则表达式提取最稳妥(能兼容字符串里的空格变化):

# 处理高度列,提取最小/最大值并转成float
df[['height_min', 'height_max']] = df['height'].str.extract(r'(\d+\.\d+)\s+to\s+(\d+\.\d+)\s+feet').astype(float)

# 用同样的逻辑处理冠幅列
df[['spread_min', 'spread_max']] = df['spread'].str.extract(r'(\d+\.\d+)\s+to\s+(\d+\.\d+)\s+feet').astype(float)

如果不想修改原DataFrame,可以用assign()生成临时列,这样更符合pandas的链式编程风格:

# 临时生成数值列,不改动原df
temp_df = df.assign(
    height_min=lambda x: x['height'].str.extract(r'(\d+\.\d+)\s+to\s+(\d+\.\d+)\s+feet')[0].astype(float),
    height_max=lambda x: x['height'].str.extract(r'(\d+\.\d+)\s+to\s+(\d+\.\d+)\s+feet')[1].astype(float),
    spread_min=lambda x: x['spread'].str.extract(r'(\d+\.\d+)\s+to\s+(\d+\.\d+)\s+feet')[0].astype(float),
    spread_max=lambda x: x['spread'].str.extract(r'(\d+\.\d+)\s+to\s+(\d+\.\d+)\s+feet')[1].astype(float)
)

第二步:映射用户描述性选项到数值范围,实现筛选

首先把前端的描述性选项和对应的数值范围做成字典,方便快速取值:

# 按你的需求定义选项映射,可根据实际情况扩展
size_option_map = {
    "桌面范围": (0.25, 1.50),  # 适合桌面、矮书架的植株
    "矮架范围": (1.51, 3.00),  # 比如适合中层书架的高度
    "落地范围": (3.01, 6.00)   # 适合落地摆放的大植株
}

接下来就可以把这个筛选条件和你之前的光照/浇水/湿度条件结合起来了。这里提供两种常见的匹配逻辑,你可以根据项目需求选择:

逻辑1:植株的高度/冠幅完全落在用户选择的范围内

比如桌面范围要求植株整体高度在0.25-1.50英尺之间,不会超出:

# 假设用户选择了"桌面范围"
user_size_pref = "桌面范围"
size_min, size_max = size_option_map[user_size_pref]

# 衔接你之前的筛选逻辑
care_df = temp_df.loc[
    lambda x: (x['sunlight'].str.lower().str.contains(user_sunlight_pref.lower())) &
              (x['watering_levels'].str.lower().str.contains(user_water_pref.lower())) &
              (x['humidity_preference'].str.lower().str.contains(user_humidity_pref.lower())) &
              # 高度完全在范围内
              (x['height_min'] >= size_min) & (x['height_max'] <= size_max) &
              # 冠幅完全在范围内
              (x['spread_min'] >= size_min) & (x['spread_max'] <= size_max)
]

逻辑2:植株的高度/冠幅与用户选择的范围有重叠

比如植株高度是1.0-2.0英尺,虽然超出了桌面范围的上限,但部分高度仍适合桌面摆放,也算符合条件:

care_df = temp_df.loc[
    lambda x: (x['sunlight'].str.lower().str.contains(user_sunlight_pref.lower())) &
              (x['watering_levels'].str.lower().str.contains(user_water_pref.lower())) &
              (x['humidity_preference'].str.lower().str.contains(user_humidity_pref.lower())) &
              # 高度范围有重叠:植株最小高度 ≤ 用户最大范围,且植株最大高度 ≥ 用户最小范围
              (x['height_min'] <= size_max) & (x['height_max'] >= size_min) &
              # 冠幅范围同理
              (x['spread_min'] <= size_max) & (x['spread_max'] >= size_min)
]

额外小提示

如果遇到部分植株不是范围值(比如'1.50 feet'这种固定高度),可以调整正则表达式兼容这种情况,或者提前做个判断处理,确保所有数据都能转换成数值。

内容的提问来源于stack exchange,提问作者tortega

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 20:47:50