如何用Pandas检查DataFrame列中数值是否为步长1的连续序列
检查DataFrame数值列是否为步长1的连续序列
没问题,我来帮你搞定这个需求——判断DataFrame里的int/float列是不是步长严格为1的连续序列。咱们结合你给的例子一步步来:
先构造你的示例数据
首先把你提供的表格转成pandas DataFrame:
import pandas as pd data = { 'inv_id': [123, 124, 125, 126, 127], 'ven_id': [1.22, 2.22, 3.22, 4.22, 5.22], 'pay_id': [1230, 1234, 1235, 1240, 1241] } df = pd.DataFrame(data)
核心思路
要判断一列是否是步长1的连续序列,关键看两点:
- 列必须是数值类型(int/float);
- 所有相邻元素的差值必须严格等于1(注意浮点数的精度问题,需要近似判断)。
实现检查函数
我写一个通用函数来检查单列:
def is_consecutive_step1(series): # 先排除非数值类型的列 if not pd.api.types.is_numeric_dtype(series): return False # 处理只有1个元素的情况(可根据需求调整,这里默认算连续) if len(series) <= 1: return True # 计算相邻元素的差值,去掉第一个NaN(因为第一个元素没有前项) diffs = series.diff().dropna() # 针对浮点数做精度兼容,避免计算误差导致误判 if series.dtype == 'float64': return all(diffs.round(9) == 1) # 整数直接判断差值是否全为1 else: return all(diffs == 1)
应用到整个DataFrame
把函数应用到每一列,就能得到结果:
check_result = df.apply(is_consecutive_step1) print(check_result)
执行后输出如下,完全符合你的预期:
inv_id True ven_id True pay_id False dtype: bool
补充说明
- 浮点数精度问题:比如
2.22 - 1.22理论上是1,但浮点数计算可能得到0.9999999999999996,所以用round(9)来消除精度误差的影响; - 特殊场景处理:如果列只有1个元素,函数默认返回
True,你可以根据自己的需求修改这个逻辑; - 重复值/断层处理:如果列里有重复值(比如
[1,2,2,3])或者断层(比如[1,3,4]),差值会出现0或大于1的情况,函数会返回False,符合连续序列的定义。
内容的提问来源于stack exchange,提问作者daiyue
相关产品推荐
相关产品推荐

