从一列获取值作为变量减去

时间:2019-03-07 20:39:55

标签: python pandas

我有一个带有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

以此类推

3 个答案:

答案 0 :(得分:3)

您可以使用groupbyapply,并使用如下计算的自定义分组器:

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