从pandas数据帧中同一字段的所有其他行中减去一行中字段中的值

Bha*_*ana 2 python dataframe 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
Run Code Online (Sandbox Code Playgroud)

我想创建一个新的领域的newval存储之间的区别VAL该行和VAL与同一行中的SID字段1 =“开始”。

   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
Run Code Online (Sandbox Code Playgroud)

我已经尝试了 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
Run Code Online (Sandbox Code Playgroud)

如何从特定行获得差异?

ank*_*_91 5

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

df['new_val'] = (df['val']-
     df.groupby(['sid',df['field1'].eq("start").cumsum()])['val'].transform("first"))
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

helper 列如下,有助于分组:

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

  • 好一个人啊!+1。 (2认同)