熊猫:根据列中的当前值设置优先值(按组)

时间:2020-02-13 14:35:18

标签: python pandas

我有一个pandas数据框,其值应大于或等于先前的值。如果当前值小于先前值,则必须将先前值设置为等于当前值。最好通过以下示例对此进行解释:

data = {'group':['A', 'A', 'A', 'A', 'A', 'B', 'B', 
                'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C'], 
                 'value':[0, 1, 2, 3, 2, 0, 1, 2, 3, 1, 5, 0, 1, 0, 3, 2]} 
df = pd.DataFrame(data)
df

  group value
0   A     0
1   A     1
2   A     2
3   A     3
4   A     2
5   B     0
6   B     1
7   B     2
8   B     3
9   B     1
10  B     5
11  C     0
12  C     1
13  C     0
14  C     3
15  C     2

我正在寻找的结果是:

  group value
0   A     0
1   A     1
2   A     2
3   A     2
4   A     2
5   B     0
6   B     1
7   B     1
8   B     1
9   B     1
10  B     5
11  C     0
12  C     0
13  C     0
14  C     2
15  C     2

2 个答案:

答案 0 :(得分:1)

这就是我的去! (特别感谢@jezrael帮助我大大简化了它!)

相反,我将其基于Expanding Windows,以便始终获得每个组中元素的后缀(从最后一个元素扩展到第一个元素)。

此扩展窗口具有以下逻辑: 对于索引i中的元素,您将得到一个Series,其中包含索引为>=i的组中的所有元素,并且我需要在结果中返回i的新单个值。
该后缀对应的值是多少?最低!因为如果后面的元素较小,我们需要选择其中最小的元素。

然后我们可以将该操作的结果分配给df['value']

尝试一下:

df['value'] = (df.iloc[::-1]
                .groupby('group')['value']
                .expanding()
                .min()
                .reset_index(level=0, drop=True)
                .astype(int))
print (df)

输出:

   group  value
0      A      0
1      A      1
2      A      2
3      A      2
4      A      2
5      B      0
6      B      1
7      B      1
8      B      1
9      B      1
10     B      5
11     C      0
12     C      0
13     C      0
14     C      2
15     C      2

答案 1 :(得分:0)

我没有得到您的输出,但是我相信您正在寻找类似的东西

df['fwd'] = df.value.shift(-1)
df['new'] = np.where(df['value'] > df['fwd'], df['fwd'], df['value'])