在熊猫条件下增加添加

Tom*_*asz 10 python pandas

对于以下熊猫数据框

    servo_in_position   second_servo_in_position    Expected output
0   0   1   0
1   0   1   0
2   1   2   1
3   0   3   0
4   1   4   2
5   1   4   2
6   0   5   0
7   0   5   0
8   1   6   3
9   0   7   0
10  1   8   4
11  0   9   0
12  1   10  5
13  1   10  5
14  1   10  5
15  0   11  0
16  0   11  0
17  0   11  0
18  1   12  6
19  1   12  6
20  0   13  0
21  0   13  0
22  0   13  0
Run Code Online (Sandbox Code Playgroud)

我只想在“ servo_in_position”从0更改为1时增加“ Expected output”列。如果“ servo_in_position”等于0,我还想假设“ Expected output”为0(空)。

我试过了

input_data['second_servo_in_position']=(input_data.servo_in_position.diff()!=0).cumsum()
Run Code Online (Sandbox Code Playgroud)

但是它提供的输出如“ second_servo_in_position”列中所示,这不是我想要的。

之后,我想使用以下方法对平均值进行分组和计算:

print("Mean=\n\n",input_data.groupby('second_servo_in_position').mean())
Run Code Online (Sandbox Code Playgroud)

Sco*_*ton 10

使用cumsummask

df ['E_output'] = df ['servo_in_position']。diff()。eq(1).cumsum()\ .mask(df ['servo_in_position'] == 0,0)

df['servo_in_position'].diff().fillna(df['servo_in_position']).eq(1).cumsum()\
   .mask(df['servo_in_position'] == 0, 0)
Run Code Online (Sandbox Code Playgroud)

输出:

    servo_in_position  second_servo_in_position  Expected output  E_output
0                   0                         1                0         0
1                   0                         1                0         0
2                   1                         2                1         1
3                   0                         3                0         0
4                   1                         4                2         2
5                   1                         4                2         2
6                   0                         5                0         0
7                   0                         5                0         0
8                   1                         6                3         3
9                   0                         7                0         0
10                  1                         8                4         4
11                  0                         9                0         0
12                  1                        10                5         5
13                  1                        10                5         5
14                  1                        10                5         5
15                  0                        11                0         0
16                  0                        11                0         0
17                  0                        11                0         0
18                  1                        12                6         6
19                  1                        12                6         6
20                  0                        13                0         0
21                  0                        13                0         0
22                  0                        13                0         0
Run Code Online (Sandbox Code Playgroud)

更新第一个等于1的位置。

df['servo_in_position'].diff().fillna(df['servo_in_position']).eq(1).cumsum()\
   .mask(df['servo_in_position'] == 0, 0)
Run Code Online (Sandbox Code Playgroud)


use*_*203 10

使用cumsum和算术。


u = df['servo_in_position']

(u.eq(1) & u.shift().ne(1)).cumsum() * u
Run Code Online (Sandbox Code Playgroud)

0     0
1     0
2     1
3     0
4     2
5     2
6     0
7     0
8     3
9     0
10    4
11    0
12    5
13    5
14    5
15    0
16    0
17    0
18    6
19    6
20    0
21    0
22    0
Name: servo_in_position, dtype: int64
Run Code Online (Sandbox Code Playgroud)


Qua*_*ang 7

尝试np.where

df['Expected_output'] = np.where(df.servo_in_position.eq(1),
                                 df.servo_in_position.diff().eq(1).cumsum(),
                                 0)
Run Code Online (Sandbox Code Playgroud)


WeN*_*Ben 6

这是cumsummul

df.servo_in_position.diff().eq(1).cumsum().mul(df.servo_in_position.eq(1),axis=0)
Run Code Online (Sandbox Code Playgroud)