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

如何基于其他列的数值范围筛选填充Pandas DataFrame

解决DataFrame按数值范围生成分类列的问题

问题场景

现有一个以datetime为索引的DataFrame,包含数值列No,需要新增分类列cat,规则如下:

  • No < 10000 → 0
  • 10000 ≤ No < 100000 → 1
  • No ≥ 100000 → 2

原代码的问题

你写的循环代码存在几个关键错误:

  • 循环中直接将cat赋值为单个数值(如2、1、0),而非往列表追加元素,最终cat只会保留最后一次循环的结果,无法生成对应长度的列
  • 条件判断遗漏了No == 10000的情况,不符合需求中10000≤No<100000的规则
  • 单个元素判断时误用&(这是pandas矢量化操作的逻辑符),Python单值判断应使用and
  • 用df.cat赋值列容易和DataFrame内置属性混淆,规范写法是df['cat']

正确解决方案

方法1:使用pd.cut(最简洁高效)

pd.cut是pandas专门用于区间划分的函数,完全匹配需求场景:

import pandas as pd

# 定义区间边界和对应标签
bins = [-float('inf'), 10000, 100000, float('inf')]
labels = [0, 1, 2]

# 生成分类列,include_lowest=True确保左区间包含边界值(即10000会被分到1类)
df['cat'] = pd.cut(df['No'], bins=bins, labels=labels, include_lowest=True)

# 若需要将分类类型转为整数
df['cat'] = df['cat'].astype(int)

方法2:使用numpy.where(矢量化判断)

利用numpy的矢量化操作,比循环效率高得多:

import numpy as np

# 嵌套where按优先级判断:先匹配最高阈值,再依次向下
df['cat'] = np.where(df['No'] >= 100000, 2,
                     np.where(df['No'] >= 10000, 1, 0))

方法3:修正循环逻辑(仅作理解用,不推荐大数据量)

如果坚持用循环,修正后的代码如下:

cat = []
for num in df['No']:
    if num >= 100000:
        cat.append(2)
    elif num >= 10000:
        # 这里无需再判断<100000,因为已排除>=100000的情况
        cat.append(1)
    else:
        cat.append(0)
df['cat'] = cat

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 14:00:59