如何比较一列中的值并使用pandas创建一个新列?

时间:2019-06-25 10:54:15

标签: python pandas

我有一个名为value的df,大小为567,它的列index如下:

index
96.875
96.6796875
96.58203125
96.38671875
95.80078125
94.7265625
94.62890625
94.3359375
58.88671875
58.7890625
58.69140625
58.59375
58.49609375
58.3984375
58.30078125
58.203125

我还有2个其他变量:

mu = 56.80877955613938

sigma = 17.78935620293665

我想要的是检查index列中的值。如果该值大于mu+3*sigma,则必须将一个名为alarm的新列添加到value df中,并且必须添加值4。

我尝试过:

for i in value['index']:
    if (i >= mu+3*sigma):
        value['alarm'] = 4
    elif ((i < mu+3*sigma) and (i >= mu+2*sigma)):
        value['alarm'] = 3
    elif((i < mu+2*sigma) and (i >= mu+sigma)):
        value['alarm'] = 2
    elif ((i < mu+sigma) and (i >= mu)):
        value['alarm'] = 1

但是它将创建一个alarm列,并用1完全填充。

我在这里犯什么错误?

预期输出:

index            alarm
96.875             3
96.6796875         3
96.58203125        3
96.38671875        3
95.80078125        3
94.7265625         3
94.62890625        3
94.3359375         3
58.88671875        1
58.7890625         1
58.69140625        1
58.59375           1
58.49609375        1
58.3984375         1
58.30078125        1
58.203125          1

1 个答案:

答案 0 :(得分:1)

如果您有多个条件,则不想遍历数据框并使用if, elif, else。更好的解决方案是使用np.select定义条件,并根据这些条件定义选择:

conditions=[
    value['index'] >= mu+3*sigma,
    (value['index'] < mu+3*sigma) & (value['index'] >= mu+2*sigma),
    (value['index'] < mu+2*sigma) & (value['index'] >= mu+sigma),    
]

choices = [4, 3, 2]

value['alarm'] = np.select(conditions, choices, default=1)
value

           alarm
index           
96.875000      3
96.679688      3
96.582031      3
96.386719      3
95.800781      3
94.726562      3
94.628906      3
94.335938      3
58.886719      1
58.789062      1
58.691406      1
58.593750      1
58.496094      1
58.398438      1
58.300781      1
58.203125      1

如果您有10分钟的时间,请here's在CS95上发表一篇不错的文章,解释为什么循环遍历数据帧是不好的做法。