首页 > 解决方案 > 如何比较列中的值并使用熊猫创建新列?

问题描述

我有一个名为value567 的 df,它有一列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

我还有两个额外的变量:

mu= 56.80877955613938

sigma= 17.78935620293665

我想要的是检查index列中的值。如果该值大于,例如,则必须将mu+3*sigma名为 的新列alarm添加到valuedf 中,并且必须添加值 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

标签: pythonpandas

解决方案


如果您有多个条件,则不希望遍历数据框并使用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 分钟的时间,这是CS95 的一篇好文章,解释了为什么循环遍历数据帧是不好的做法。


推荐阅读