下面我有一个小数据集,包含3列、ID;标签和值.标签表示特征"值"所基于的信息来源.

我想为"价值"创建一个滞后功能.下面我以一种简单的方式做到这一点.然而,对于索引3和4,我们可以看到"tag"具有相同的值.这种情况我不希望.

我希望考虑"标签".我想要一个条件,即仅当"标签"功能不相同时才执行转移.

什么是执行此操作的好方法?

import pandas as pd
import numpy as np

df = pd.DataFrame({'ID':[1,1,1,2,2, 2,2,3,3,3],
              'tag':[10, 11, 15, 11, 12, 12, 13, 16, 17, 18],
             'value':[21, 19, 22, 41, 43, 43, 38, 9, 12, 16]})

df['value_lag'] = df.sort_values(by=['ID', 'tag']).groupby('ID')['value'].shift(1)

print(df)
     ID  tag  value  value_lag
0   1   10     21        NaN
1   1   11     19       21.0
2   1   15     22       19.0
3   2   11     41        NaN
4   2   12     43       41.0
5   2   12     43       43.0
6   2   13     38       43.0
7   3   16      9        NaN
8   3   17     12        9.0
9   3   18     16       12.0

期望的输出是:

   ID  tag  value  value_lag
0   1   10     21        NaN
1   1   11     19       21.0
2   1   15     22       19.0
3   2   11     41        NaN
4   2   12     43       41.0
5   2   12     43       41.0 -Here, should not be 43 
6   2   13     38       43.0
7   3   16      9        NaN
8   3   17     12        9.0
9   3   18     16       12.0

推荐答案

您可以删除重复项,创建MultiIndex,然后使用DataFrameGroupBy.shift并将移动系列与原始系列连接DataFrame.join:

df = df.join(df.sort_values(by=['ID', 'tag'])
               .drop_duplicates(['ID','tag'])
               .set_index(['ID','tag'])
               .groupby('ID')['value'].shift().rename('value_lag'), on=['ID','tag']) 

print(df)
   ID  tag  value  value_lag
0   1   10     21        NaN
1   1   11     19       21.0
2   1   15     22       19.0
3   2   11     41        NaN
4   2   12     43       41.0
5   2   12     43       41.0
6   2   13     38       43.0
7   3   16      9        NaN
8   3   17     12        9.0
9   3   18     16       12.0

Python相关问答推荐

跟踪我已从数组中 Select 的样本的最有效方法

Python 3.12中的通用[T]类方法隐式类型检索

使用SciPy进行曲线匹配未能给出正确的匹配

numpy卷积与有效

如何调整QscrollArea以正确显示内部正在变化的Qgridlayout?

如何使用SentenceTransformers创建矢量嵌入?

将scipy. sparse矩阵直接保存为常规txt文件

如果初始groupby找不到满足掩码条件的第一行,我如何更改groupby列,以找到它?

在Python中计算连续天数

将标签移动到matplotlib饼图中楔形块的开始处

在matplotlib中使用不同大小的标记顶部添加批注

在Python中从嵌套的for循环中获取插值

如何在Great Table中处理inf和nans

查看pandas字符列是否在字符串列中

使用python playwright从 Select 子菜单中 Select 值

如何将返回引用的函数与pybind11绑定?

随机森林n_估计器的计算

EST格式的Azure数据库笔记本中的当前时间戳

为什么按下按钮后屏幕的 colored颜色 保持不变?

为什么在更新Pandas 2.x中的列时,数据类型不会更改,而在Pandas 1.x中会更改?