我有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
答案 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
。