如何在Pandas中为每2秒间隔的时间列生成条件标记列?
解决方案
你的需求核心是判断time列向下取整后的值是否为2的倍数,同一取整点的所有行统一标记。用Pandas的向量化操作就能高效实现,不需要用apply(效率低且容易出错):
步骤1:构造示例数据
import pandas as pd import numpy as np df = pd.DataFrame({ 'id': [1,2,3,4,5,6,7,8,9,10], 'name': ['name1','name2','name3','name4','name5','name6','name7','name8','name9','name10'], 'time': [260.123,261.323,261.342,261.567,262.123,262.345,264.876,265.234,266.234,267.234] })
步骤2:新增time_delta列
直接通过向量化判断实现,无需自定义函数:
# 先对time列向下取整,再判断是否为2的倍数,映射为yes/no df['time_delta'] = np.where(np.floor(df['time']).astype(int) % 2 == 0, 'yes', 'no')
执行后得到的结果完全符合你的期望:
id name time time_delta 0 1 name1 260.123 yes 1 2 name2 261.323 no 2 3 name3 261.342 no 3 4 name4 261.567 no 4 5 name5 262.123 yes 5 6 name6 262.345 yes 6 7 name7 264.876 yes 7 8 name8 265.234 no 8 9 name9 266.234 yes 9 10 name10 267.234 no
你之前代码的问题分析
- 变量作用域错误:自定义函数
apply_test里的prev每次调用都会被重新赋值为当前num,无法在迭代之间保留上一次的值,逻辑完全不成立。 - 需求理解偏差:你的需求是判断取整后的值是否为2的倍数,而不是判断当前值是否比前一个值大2,原函数的逻辑从根本上不符合需求。
内容的提问来源于stack exchange,提问作者GoGo
相关产品推荐
相关产品推荐

