从一列中获取值作为减法变量

2024-04-24 05:57:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带有XY和距离的数据框。我要做的是将距离存储为一个变量,如果X或Y的值大于0,则从下一个距离中减去它

这是一个示例

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

等等


Tags: 数据距离示例dfdist数字例子思想
3条回答

您可以使用groupbyapply,使用自定义的grouper,计算如下:

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

其思想是标记所有必须从相应组的第一个非零值中减去的行

检查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

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

相关问题 更多 >