使用条件的前向填充和groupby重新声明值(每行将值减少1)

时间:2019-07-15 19:11:45

标签: python

我有2列: x y 。我想重述 y 的值并使它像10,9,8,7,6 ... 0这样连续,所以如果 y 中缺少值,应该如果小于等于预期值,则用=(先前值-1)填充。另一个条件是,应该分组依据 x

我拥有的列:“ x”,“ y”

我想要的列:'desire_output'

您可以查看下表以获得更好的理解。

x   y   desire_output
1   10  10
1   9   9
1   NaN 8
1   NaN 7
1   6   6
1   5   5
1   4   4
1   3   3
1   2   2
1   1   1
1   0   0
1   4   4
1   0   3
1   0   2
1   1   1
2   8   8
2   6   7
2   3   6
2   5   5
2   4   4
2   3   3

1 个答案:

答案 0 :(得分:0)

如果我的理解正确,您想对x列进行分组,然后从y中的第一个值开始倒数。

如果递减计数达到负值,请将计数器重置为相应的y值。

这是以下代码的作用:

out = df.groupby('x').apply(lambda dd : pd.Series(range(int(dd['y'].iloc[0]), int(dd['y'].iloc[0]) - len(dd), -1)))
df['desired_output'] = out.reset_index(drop=True)

while (df['desired_output'] < 0).any():
    corr = df.groupby('x').apply(lambda dd : (dd['y'] +1).where(dd['desired_output'].eq(-1), 0).cumsum())
    df['correcting'] = corr.reset_index(drop=True).astype(int)
    df['desired_output'] = df['correcting'] + df['desired_output']

df.drop('correcting', axis=1, inplace=True)

while循环允许执行相同的操作,直到'desired_output'列中不再有负值为止,并每次添加正确值以设置第一个负数(-1)到y中的值。

假设df是您发布的示例数据框,最终结果是:

    x     y  desired_output
0   1  10.0              10
1   1   9.0               9
2   1   NaN               8
3   1   NaN               7
4   1   6.0               6
5   1   5.0               5
6   1   4.0               4
7   1   3.0               3
8   1   2.0               2
9   1   1.0               1
10  1   0.0               0
11  1   4.0               4
12  1   0.0               3
13  1   0.0               2
14  1   1.0               1
15  2   8.0               8
16  2   6.0               7
17  2   3.0               6
18  2   5.0               5
19  2   4.0               4
20  2   3.0               3

这里的假设是x是单音的(没有稀疏值),并且在x增加的行中,y不是NaN,就像您显示的那样例。另外,当倒数为y时,NaN不应为-1