基于分类列变化计算滚动时间差的高效实现问询
高效计算分类变量切换后的累计秒数
现有如下结构的DataFrame:
| A | t | X(期望输出) |
|---|---|---|
| 1 | 0.0 | 0 |
| 1 | 3.2 | 3.2 |
| 1 | 3.9 | 3.9 |
| 1 | 18.0 | 18 |
| 1 | 27.4 | 27.4 |
| 3 | 47.4 | 0 |
| 3 | 50.2 | 2.9 |
| 3 | 57.2 | 9.8 |
| 3 | 64.8 | 17.4 |
| 3 | 76.4 | 29.1 |
| 2 | 80.5 | 0 |
| 1 | 85.3 | 0 |
| 1 | 87.4 | 2.1 |
需求:计算列X,表示自A列值发生变化以来的秒数。用循环实现效率过低,尝试以下代码未得到正确结果:
g = df[A].transform(lambda x: x.diff().ne(0).cumsum()) df[X] = df[A].cumcount() + 1
高效解决方案
核心思路是先对连续相同的A值进行分组,再在每个分组内用当前t值减去分组内第一个t值,即可得到目标结果:
生成连续分组标识
用ne()结合shift()判断当前行A值是否和上一行不同,再通过cumsum()生成连续相同A的分组ID:df['group_id'] = df['A'].ne(df['A'].shift()).cumsum()计算目标列X
按分组ID分组后,对t列应用transform('first')获取每组的起始时间,再用当前t减去起始时间:df['X'] = df['t'] - df.groupby('group_id')['t'].transform('first')可选:匹配示例精度
如果需要和示例中的小数位数一致,可对结果做四舍五入处理:df['X'] = df['X'].round(1)
执行后得到的X列完全匹配期望输出,全程使用pandas内置向量化操作,效率远高于循环实现。
内容的提问来源于stack exchange,提问作者GaryJones8
相关产品推荐
相关产品推荐

