首页 > 解决方案 > 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

标签: pythonpandas

解决方案


所以这就是我的出发点!(特别感谢@jezrael 帮助我大大简化了它!)

我以此为基础Expanding Windows,反过来,总是得到每个组中元素的后缀(从最后一个元素开始,向第一个元素扩展)。

这个扩展窗口具有以下逻辑:对于 index 中的元素i,您会得到一个Series包含所有带有 indices 的组中的元素>=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

推荐阅读