Pandas 带条件移位操作

问题描述 投票:0回答:1

下面我有一个包含 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
python pandas
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.