在不同变量

时间:2015-06-21 01:20:09

标签: pandas triggers

我希望将'Original_Level'上限的值设置为另一列'NS'触及触发器的水平(在这种情况下为abs(NS)> = 4)。创建了这个新列'Desired_Level',同时保持'Original_Level'列不变。当abs(NS)> = 4时,下面的df表示上限为13.122和50.887

In [36]:df

Out [36]:
Original_level     NS   Desired_Level
    9.566       -8.099    13.122
    10.629      -6.830    13.122
    11.810      -5.655    13.122
    13.122      -4.561    13.122
    14.580      -3.538    14.580
    16.200      -2.577    16.200
    18.000      -1.670    18.000
    20.000      -0.813    20.000
    22.000       0.000    22.000
    25.300       0.774    25.300
    29.095       1.511    29.095
    33.459       2.216    33.459
    38.478       2.891    38.478
    44.250       3.538    44.250
    50.887       4.160    50.887
    58.520       4.758    50.887
    67.299       5.335    50.887

我正在寻找一种通用解决方案,它可以在两个方向上远离最低abs(NS)水平,同时击中-4和+4触发器。如果没有命中(它可能不是),那么所需的级别就是original_level

另外需要注意的是,从(min(NS))水平开始,abs(NS)的尺寸始终会增长。 。在这种情况下,我把它作为0.0000但可能是零以外的一些小数

提前感谢您的任何帮助

1 个答案:

答案 0 :(得分:1)

您希望使用clip,首先使用idxmaxidxmin查找上限和下限剪辑的索引,然后将这些值作为参数传递:

In [14]:
clip = 4
lower = df.loc[df['NS'] <= -clip, 'Original_level'].idxmax()
upper = df.loc[df['NS'] >= clip, 'Original_level'].idxmin()
df['Original_level'] = df['Original_level'].clip(df.loc[lower, 'Original_level'], df.loc[upper, 'Original_level'])
df

Out[14]:
    Original_level     NS  Desired_Level
0           13.122 -8.099         13.122
1           13.122 -6.830         13.122
2           13.122 -5.655         13.122
3           13.122 -4.561         13.122
4           14.580 -3.538         14.580
5           16.200 -2.577         16.200
6           18.000 -1.670         18.000
7           20.000 -0.813         20.000
8           22.000  0.000         22.000
9           25.300  0.774         25.300
10          29.095  1.511         29.095
11          33.459  2.216         33.459
12          38.478  2.891         38.478
13          44.250  3.538         44.250
14          50.887  4.160         50.887
15          50.887  4.758         50.887
16          50.887  5.335         50.887