下面我有一个包含 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