如何判断Pandas DataFrame中数值是否发生十位/百位增长
问题根因
现有代码无法得到正确结果有两个核心错误:
- 传入的
value列是字符串格式,字符串比较遵循字典序规则,和数值大小比较逻辑完全不一致,比如字符串'9'会被判定为大于'10',比对基础就错了。 - 判断逻辑完全不符合需求:一是大小判断方向写反,二是没有针对十位/百位进位做判定,只是做了全量数值的大小比较,没法过滤个位数小幅度增长的场景。
修复方案
核心判定逻辑:要识别十位进位,只需要对数值做除以10取整(拿到十位及以上数位的数值),和上一行同规则计算的结果比较,如果当前值更大就说明发生了十位进位;如果要识别百位进位,把取整除数换成100即可,个位数、小数点后级别的小幅度增长不会触发这个判定条件。
匹配你预期输出的完整代码如下:
import pandas as pd import numpy as np data = {'value':['9','10','19','22','31']} df = pd.DataFrame(data) # 先将字符串格式的数值转换为整数类型 df['value'] = df['value'].astype(int) df['value_copy'] = df['value'].shift(1) # 十位进位判定,需要同时判定百位的话追加 df['value']//100 > df['value_copy']//100 的或条件即可 df['Increase'] = np.where(df['value']//10 > df['value_copy']//10, 1, 0) print(df['Increase'].tolist())
运行结果
代码执行后Increase列的输出为[nan, 1, 0, 1, 1],和你给出的预期结果完全一致。
扩展提示:如果你的数据包含小数,先对数值做
np.floor()向下取整后再做整除判定即可,不会出现0.02这类小幅增长被误判为进位的情况。
内容的提问来源于stack exchange,提问作者AchillesDay
相关产品推荐
相关产品推荐

