我有一个带有XY和距离的数据框。我想做的是将距离存储为变量,如果X或Y的值大于0,则从下一个距离中减去它
这是样本df
dist x y
0 12.93 99.23
200 0 0
400 0 0
600 0 0
800 0 0
1000 12.46 99.14
1200 0 0
1400 0 0
1600 0 0
1800 0 0
2000 12.01 99.07
这是新的df
dist x y
0 12.93 99.23
200 0 0
400 0 0
600 0 0
800 0 0
0 12.46 99.14
200 0 0
400 0 0
600 0 0
800 0 0
2000 12.01 99.07
最后一个值无关紧要,但是从技术上讲,它将是0。
这个想法是,在每个已知XY处,将距离指定为0并减去该距离,直到下一个已知XY 在上面的示例中,距离是四舍五入的数字,但实际上,它们可能像
132.05
19.999
1539.65
以此类推
答案 0 :(得分:3)
您可以使用groupby
和apply
,并使用如下计算的自定义分组器:
grouper = (df['x'].ne(0) | df['y'].ne(0)).cumsum()
df['dist'].groupby(grouper).apply(lambda x: x - x.values[0])
0 0
1 200
2 400
3 600
4 800
5 0
6 200
7 400
8 600
9 800
10 0
Name: dist, dtype: int64
在哪里
grouper
0 1
1 1
2 1
3 1
4 1
5 2
6 2
7 2
8 2
9 2
10 3
dtype: int64
想法是标记所有必须从该对应组的第一个非零值中减去的行。
答案 1 :(得分:3)
使用where
+ ffill
df['dist'] = df.dist - df.where(df.x.gt(0) | df.y.gt(0)).dist.ffill()
dist x y
0 0.0 12.93 99.23
1 200.0 0.00 0.00
2 400.0 0.00 0.00
3 600.0 0.00 0.00
4 800.0 0.00 0.00
5 0.0 12.46 99.14
6 200.0 0.00 0.00
7 400.0 0.00 0.00
8 600.0 0.00 0.00
9 800.0 0.00 0.00
10 0.0 12.01 99.07
答案 2 :(得分:3)
使用transform
df.dist-=df.groupby(df.x.ne(0).cumsum())['dist'].transform('first')
df
Out[769]:
dist x y
0 0 12.93 99.23
1 200 0.00 0.00
2 400 0.00 0.00
3 600 0.00 0.00
4 800 0.00 0.00
5 0 12.46 99.14
6 200 0.00 0.00
7 400 0.00 0.00
8 600 0.00 0.00
9 800 0.00 0.00
10 0 12.01 99.07