需要将一个 Pandas (Python) 数据帧与另一个数据帧的值进行比较
Need to compare one Pandas (Python) dataframe with values from another dataframe
所以我从 sql 服务器中提取数据,并输入到数据框中。所有数据都是离散形式,并在一个方向(0.0、0.1、0.2 ... 9.8、9.9、10.0)上以 0.1 的步长增加,每个步长具有多个功率值(例如 1000、1412、134.5、657.1 在0.1), (14.5, 948.1, 343.8 at 5.5) - 希望你明白我想说的。
我已经设法使用以下方法将数据分组到这些单独的步骤中,然后计算每组的平均值和标准差。
group = df.groupby('step').power.mean()
group2 = df.groupby('step').power.std().fillna(0)
这会产生两个数据框(group 和 group2),每个数据框的平均值和标准差为 0.1。然后使用以下内容很容易为每个步骤创建上限和下限:
upperlimit = group + 3*group2
lowerlimit = group - 3*group2
lowerlimit[lowerlimit<0] = 0
现在让我感到困惑的一点来了!我需要返回到原始数据框并删除 rows/instances ,其中功率值超出了这些计算出的限制(请注意,每 0.1 步都有不同的上限和下限)。
这里有 50 行示例数据:
Index Power Step
0 106.0 5.0
1 200.4 5.5
2 201.4 5.6
3 226.9 5.6
4 206.8 5.6
5 177.5 5.3
6 124.0 4.9
7 121.0 4.8
8 93.9 4.7
9 135.6 5.0
10 211.1 5.6
11 265.2 6.0
12 281.4 6.2
13 417.9 6.9
14 546.0 7.4
15 619.9 7.9
16 404.4 7.1
17 241.4 5.8
18 44.3 3.9
19 72.1 4.6
20 21.1 3.3
21 6.3 2.3
22 0.0 0.8
23 0.0 0.9
24 0.0 3.2
25 0.0 4.6
26 33.3 4.2
27 97.7 4.7
28 91.0 4.7
29 105.6 4.8
30 97.4 4.6
31 126.7 5.0
32 134.3 5.0
33 133.4 5.1
34 301.8 6.3
35 298.5 6.3
36 312.1 6.5
37 505.3 7.5
38 491.8 7.3
39 404.6 6.8
40 324.3 6.6
41 347.2 6.7
42 365.3 6.8
43 279.7 6.3
44 351.4 6.8
45 350.1 6.7
46 573.5 7.9
47 490.1 7.5
48 520.4 7.6
49 548.2 7.9
换句话说,您想要对分组数据执行一些操作,然后将这些操作的结果投影回未分组的行,以便您可以使用它们来过滤这些行。一种方法是使用 transform
:
The transform method returns an object that is indexed the same (same size) as the one being grouped. Thus, the passed transform function should return a result that is the same size as the group chunk.
然后您可以直接创建新行:
df['upper'] = df.groupby('step').power.transform(lambda p: p.mean() + 3*p.std().fillna(0))
df['lower'] = df.groupby('step').power.transform(lambda p: p.mean() - 3*p.std().fillna(0))
df.loc[df['lower'] < 0, 'lower'] = 0
并进行相应排序:
df = df[(df.power <= df.upper) & (df.power >= df.lower())]
所以我从 sql 服务器中提取数据,并输入到数据框中。所有数据都是离散形式,并在一个方向(0.0、0.1、0.2 ... 9.8、9.9、10.0)上以 0.1 的步长增加,每个步长具有多个功率值(例如 1000、1412、134.5、657.1 在0.1), (14.5, 948.1, 343.8 at 5.5) - 希望你明白我想说的。
我已经设法使用以下方法将数据分组到这些单独的步骤中,然后计算每组的平均值和标准差。
group = df.groupby('step').power.mean()
group2 = df.groupby('step').power.std().fillna(0)
这会产生两个数据框(group 和 group2),每个数据框的平均值和标准差为 0.1。然后使用以下内容很容易为每个步骤创建上限和下限:
upperlimit = group + 3*group2
lowerlimit = group - 3*group2
lowerlimit[lowerlimit<0] = 0
现在让我感到困惑的一点来了!我需要返回到原始数据框并删除 rows/instances ,其中功率值超出了这些计算出的限制(请注意,每 0.1 步都有不同的上限和下限)。
这里有 50 行示例数据:
Index Power Step
0 106.0 5.0
1 200.4 5.5
2 201.4 5.6
3 226.9 5.6
4 206.8 5.6
5 177.5 5.3
6 124.0 4.9
7 121.0 4.8
8 93.9 4.7
9 135.6 5.0
10 211.1 5.6
11 265.2 6.0
12 281.4 6.2
13 417.9 6.9
14 546.0 7.4
15 619.9 7.9
16 404.4 7.1
17 241.4 5.8
18 44.3 3.9
19 72.1 4.6
20 21.1 3.3
21 6.3 2.3
22 0.0 0.8
23 0.0 0.9
24 0.0 3.2
25 0.0 4.6
26 33.3 4.2
27 97.7 4.7
28 91.0 4.7
29 105.6 4.8
30 97.4 4.6
31 126.7 5.0
32 134.3 5.0
33 133.4 5.1
34 301.8 6.3
35 298.5 6.3
36 312.1 6.5
37 505.3 7.5
38 491.8 7.3
39 404.6 6.8
40 324.3 6.6
41 347.2 6.7
42 365.3 6.8
43 279.7 6.3
44 351.4 6.8
45 350.1 6.7
46 573.5 7.9
47 490.1 7.5
48 520.4 7.6
49 548.2 7.9
换句话说,您想要对分组数据执行一些操作,然后将这些操作的结果投影回未分组的行,以便您可以使用它们来过滤这些行。一种方法是使用 transform
:
The transform method returns an object that is indexed the same (same size) as the one being grouped. Thus, the passed transform function should return a result that is the same size as the group chunk.
然后您可以直接创建新行:
df['upper'] = df.groupby('step').power.transform(lambda p: p.mean() + 3*p.std().fillna(0))
df['lower'] = df.groupby('step').power.transform(lambda p: p.mean() - 3*p.std().fillna(0))
df.loc[df['lower'] < 0, 'lower'] = 0
并进行相应排序:
df = df[(df.power <= df.upper) & (df.power >= df.lower())]