Python 计算数据帧中满足条件的某些行的标准偏差

Python 计算数据帧中满足条件的某些行的标准偏差,python,pandas,Python,Pandas,我想计算熊猫数据框中“值”的标准偏差,条件是它是为常见的“分组测量”计算的。计算后,我想计算评论行 我试着说: df['standard_deviation'] = df['grouped_measurement'].diff().fillna(df['value']).std() 但它并没有像预期的那样工作。我的完整代码如下所示: import pandas as pd import numpy as np # Define input dataframe df = {'servo_in

我想计算熊猫数据框中“值”的标准偏差,条件是它是为常见的“分组测量”计算的。计算后,我想计算评论行

我试着说:

df['standard_deviation'] = df['grouped_measurement'].diff().fillna(df['value']).std()
但它并没有像预期的那样工作。我的完整代码如下所示:

import pandas as pd 
import numpy as np

# Define input dataframe
df = {'servo_in_position':      [1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1],
        'value':                [0.2,2.1,3.5,6.7,2.1,3.4,5.7,9.6,3.2,1.2,6.3,8.5,7.4,6.2,3.4,3.8,1.7,2.8,7.6,4.5,9.0]}

df = pd.DataFrame(df,columns= ['servo_in_position','value'])
print("Dataframe is:\n",df)

print("Grouping data according to servo positions, please wait...")
df['grouped_measurement'] = df['servo_in_position'].diff().fillna(df['servo_in_position']).eq(1).cumsum().mask(df['servo_in_position'] == 0, 0)
df['standard_deviation'] = df['grouped_measurement'].diff().fillna(df['value']).std()

# df=df.groupby('grouped_measurement',as_index=False).mean()
# df['new_value']=df['standard_deviation']*100/df['value']

print("Data grouped successfully!")
print("Input data:\n",df)
预期产出如下:

       servo_in_position       value        grouped_measurement      standard_deviation
0                1                0.2                1                1.6563011
1                1                2.1                1                1.6563011
2                1                3.5                1                1.6563011
3                0                6.7                0                0
4                0                2.1                0                0
5                0                3.4                0                0
6                1                5.7                2                3.194526569
7                1                9.6                2                3.194526569
8                1                3.2                2                3.194526569
9                1                1.2                2                3.194526569
10                1                6.3                2                3.194526569
11                0                8.5                0                0
12                0                7.4                0                0
13                0                6.2                0                0
14                0                3.4                0                0
15                1                3.8                3                2.832666588
16                1                1.7                3                2.832666588
17                1                2.8                3                2.832666588
18                1                7.6                3                2.832666588
19                1                4.5                3                2.832666588
20                1                9                 3                2.832666588


您可以简化代码-创建
系列
s1
s2
,并与
std
一起第二次使用,以用聚集值填充新列,还按条件为set
0
添加了:

mask = df['servo_in_position'] == 0
s1 = df['servo_in_position'].diff().ne(0).cumsum()
s2 = df['value'].groupby(s1).transform('std')

#if need omit helper column simple remove df['grouped_measurement'] = np.where(mask, 0, s1)
df['grouped_measurement'] = np.where(mask, 0, s1)
df['standard_deviation'] = np.where(mask, 0, s2)
print("Dataframe is:\n",df)

     servo_in_position  value  grouped_measurement  standard_deviation
0                   1    0.2                     1            1.656301
1                   1    2.1                     1            1.656301
2                   1    3.5                     1            1.656301
3                   0    6.7                     0            0.000000
4                   0    2.1                     0            0.000000
5                   0    3.4                     0            0.000000
6                   1    5.7                     3            3.194527
7                   1    9.6                     3            3.194527
8                   1    3.2                     3            3.194527
9                   1    1.2                     3            3.194527
10                  1    6.3                     3            3.194527
11                  0    8.5                     0            0.000000
12                  0    7.4                     0            0.000000
13                  0    6.2                     0            0.000000
14                  0    3.4                     0            0.000000
15                  1    3.8                     5            2.832667
16                  1    1.7                     5            2.832667
17                  1    2.8                     5            2.832667
18                  1    7.6                     5            2.832667
19                  1    4.5                     5            2.832667
20                  1    9.0                     5            2.832667

您可以简化代码-创建
系列
s1
s2
,并与
std
一起第二次使用,以用聚集值填充新列,还按条件为set
0
添加了:

mask = df['servo_in_position'] == 0
s1 = df['servo_in_position'].diff().ne(0).cumsum()
s2 = df['value'].groupby(s1).transform('std')

#if need omit helper column simple remove df['grouped_measurement'] = np.where(mask, 0, s1)
df['grouped_measurement'] = np.where(mask, 0, s1)
df['standard_deviation'] = np.where(mask, 0, s2)
print("Dataframe is:\n",df)

     servo_in_position  value  grouped_measurement  standard_deviation
0                   1    0.2                     1            1.656301
1                   1    2.1                     1            1.656301
2                   1    3.5                     1            1.656301
3                   0    6.7                     0            0.000000
4                   0    2.1                     0            0.000000
5                   0    3.4                     0            0.000000
6                   1    5.7                     3            3.194527
7                   1    9.6                     3            3.194527
8                   1    3.2                     3            3.194527
9                   1    1.2                     3            3.194527
10                  1    6.3                     3            3.194527
11                  0    8.5                     0            0.000000
12                  0    7.4                     0            0.000000
13                  0    6.2                     0            0.000000
14                  0    3.4                     0            0.000000
15                  1    3.8                     5            2.832667
16                  1    1.7                     5            2.832667
17                  1    2.8                     5            2.832667
18                  1    7.6                     5            2.832667
19                  1    4.5                     5            2.832667
20                  1    9.0                     5            2.832667

首先,我们创建一个系列
s
,该系列将
伺服位置的每个更改定义为一个唯一的组

然后我们对这些组进行
GroupBy.transform(std)
。我们使用
transform
获得一个等长向量,这样我们就可以将它定义为现有数据帧的一个新列,否则数据将被聚合

我们使用
np.where
来有条件地分配
std
,如果
servo\u in\u pisition!=0

s1 = df['servo_in_position'].diff().ne(0).cumsum()
s2 = df.groupby(s)['value'].transform('std')

df['standard_deviation'] = np.where(df['servo_in_position'].ne(0), s2, 0)
输出

    servo_in_position  value  standard_deviation
0                   1    0.2            1.656301
1                   1    2.1            1.656301
2                   1    3.5            1.656301
3                   0    6.7            0.000000
4                   0    2.1            0.000000
5                   0    3.4            0.000000
6                   1    5.7            3.194527
7                   1    9.6            3.194527
8                   1    3.2            3.194527
9                   1    1.2            3.194527
10                  1    6.3            3.194527
11                  0    8.5            0.000000
12                  0    7.4            0.000000
13                  0    6.2            0.000000
14                  0    3.4            0.000000
15                  1    3.8            2.832667
16                  1    1.7            2.832667
17                  1    2.8            2.832667
18                  1    7.6            2.832667
19                  1    4.5            2.832667
20                  1    9.0            2.832667

首先,我们创建一个系列
s
,该系列将
伺服位置的每个更改定义为一个唯一的组

然后我们对这些组进行
GroupBy.transform(std)
。我们使用
transform
获得一个等长向量,这样我们就可以将它定义为现有数据帧的一个新列,否则数据将被聚合

我们使用
np.where
来有条件地分配
std
,如果
servo\u in\u pisition!=0

s1 = df['servo_in_position'].diff().ne(0).cumsum()
s2 = df.groupby(s)['value'].transform('std')

df['standard_deviation'] = np.where(df['servo_in_position'].ne(0), s2, 0)
输出

    servo_in_position  value  standard_deviation
0                   1    0.2            1.656301
1                   1    2.1            1.656301
2                   1    3.5            1.656301
3                   0    6.7            0.000000
4                   0    2.1            0.000000
5                   0    3.4            0.000000
6                   1    5.7            3.194527
7                   1    9.6            3.194527
8                   1    3.2            3.194527
9                   1    1.2            3.194527
10                  1    6.3            3.194527
11                  0    8.5            0.000000
12                  0    7.4            0.000000
13                  0    6.2            0.000000
14                  0    3.4            0.000000
15                  1    3.8            2.832667
16                  1    1.7            2.832667
17                  1    2.8            2.832667
18                  1    7.6            2.832667
19                  1    4.5            2.832667
20                  1    9.0            2.832667