我有一个名为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
答案 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上发表一篇不错的文章,解释为什么循环遍历数据帧是不好的做法。