如何基于其他列的数值范围筛选填充Pandas DataFrame
解决DataFrame按数值范围生成分类列的问题
问题场景
现有一个以datetime为索引的DataFrame,包含数值列No,需要新增分类列cat,规则如下:
No < 10000→ 010000 ≤ No < 100000→ 1No ≥ 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
相关产品推荐
相关产品推荐

