我在上一个问题(Pandas Dataframe Question: Subtract next row and add specific value if NaN)上犯了一个小错误
import pandas as pd
df = pd.DataFrame({'label': 'a a b a c c b b c'.split(), 'Val': [2,2,6, 8, 14, 14,16, 18, 22]})
df
label Val
0 a 2
1 a 2
2 b 6
3 a 8
4 c 14
5 c 14
6 b 16
7 b 18
8 c 22
df['Results'] = abs(df.groupby(['label'])['Val'].diff(-1)).fillna(3)
df
label Val Results
0 a 2 0.0
1 a 2 6.0
2 b 6 10.0
3 a 8 3.0
4 c 14 0.0
5 c 14 8.0
6 b 16 2.0
7 b 18 3.0
8 c 22 3.0
是否有可能得到这样的东西:
label Val Results
0 a 2 6.0
1 a 2 6.0
2 b 6 10.0
3 a 8 3.0
4 c 14 8.0
5 c 14 8.0
6 b 16 2.0
7 b 18 3.0
8 c 22 3.0
没有零值,相同距离下的值应该相同。
答案 0 :(得分:1)
如果需要每组最后一个非0
值替换0
,则可以将0
替换为缺失值,并添加GroupBy.bfill
:
df['Results'] = (df.groupby(['label'])['Val']
.diff(-1)
.fillna(3)
.replace(0, np.nan)
.groupby(df['label'])
.bfill()
.abs())
print (df)
label Val Results
0 a 2 6.0
1 a 2 6.0
2 b 6 10.0
3 a 8 3.0
4 c 14 8.0
5 c 14 8.0
6 b 16 2.0
7 b 18 3.0
8 c 22 3.0