python - 从 Pandas 数据框中同一字段的所有其他行中减去一行字段中的值

我有一个数据框,如下所示:

data = {'sid':[1,1,1,2,2,2],
        'field1':['start', None, None, 'start', None, None], 
        'field2':['a', 'b', 'z', 'd', 'z','s'],
        'val':[20, 22, 23, 40, 45, 47]}
df = pd.DataFrame(data)
print(df)

   sid field1  val
0    1  start   20
1    1   None   22
2    1   None   23
3    2  start   40
4    2   None   45
5    2   None   47

我想创建一个新字段 newval 来存储该行的 val 与具有相同行的 val 之间的差异sidfield1 = '开始'。

   sid field1  val  newval
0    1  start   20     NaN
1    1   None   22     2.0
2    1   None   23     3.0
3    2  start   40     NaN
4    2   None   45     5.0
5    2   None   47     7.0

我已经尝试过 diff() 和 groupby() 但这给了我一个运行差异。

 df['newval'] = df.groupby('sid')['val'].diff()

   sid field1  val  newval
0    1  start   20     NaN
1    1   None   22     2.0
2    1   None   23     1.0
3    2  start   40     NaN
4    2   None   45     5.0
5    2   None   47     2.0

如何从特定行中获取差异?

最佳答案

您可以将 groupby 与辅助列和 sid 一起使用,然后获取组的第一个值,然后从 val 字段中减去。

df['new_val'] = (df['val']-
     df.groupby(['sid',df['field1'].eq("start").cumsum()])['val'].transform("first"))

print(df)

   sid field1 field2  val  new_val
0    1  start      a   20        0
1    1   None      b   22        2
2    1   None      z   23        3
3    2  start      d   40        0
4    2   None      z   45        5
5    2   None      s   47        7

辅助列如下,有助于分组:

print(df['field1'].eq("start").cumsum())
0    1
1    1
2    1
3    2
4    2
5    2
Name: field1, dtype: int32

https://stackoverflow.com/questions/65367327/

相关文章:

python - , 运算符用在条件语句的右侧时有何作用?

c# - Windows 窗体在没有文本框的情况下添加文本

javascript - 如何在 Nestjs 中扩展多个 dto 类

r - 有没有办法根据名称自动执行 R 中列的乘法?

r - 如何使用 dplyr 在 R 中转置数据帧?

bash - 删除重复行立即忽略第一个字段

windows - 使 HTML 不适用于 Windows 10 中的 Sphinx 文档

r - as.integer(8952) = 8951?

javascript - 轻松设置 react redux with next.js (React)

amazon-web-services - Amazon RDS 和 VPC 端点连接