如何基于多个先前值的熊猫条件计算新列

时间:2018-10-07 14:06:10

标签: python pandas dataframe conditional-statements

我有以下数据框。 如何基于以下内容创建新列: 例如,如果19:24的行的diff <.1 并且19:21的行的差异小于.1 然后创建新列并将行设置为等于1

我知道如何使用if语句来完成这些操作,但是我一直坚持尝试使用熊猫(更有效)的解决方案。

                    open     high      low    close      diff                   
TimeStamp                                                                           
2018-10-05 19:00:00  6637.90  6645.06  6637.17  6643.52 -0.057705                   
2018-10-05 19:03:00  6643.52  6650.00  6641.00  6649.99  0.002710                   
2018-10-05 19:06:00  6648.91  6650.00  6640.82  6642.85 -0.017769                   
2018-10-05 19:09:00  6642.85  6646.47  6642.00  6646.20  0.000000                   
2018-10-05 19:12:00  6646.20  6646.21  6642.00  6642.40  0.085065                   
2018-10-05 19:15:00  6641.00  6641.84  6636.35  6638.54 -0.024863                   
2018-10-05 19:18:00  6639.26  6643.38  6638.00  6640.00 -0.067340                   
2018-10-05 19:21:00  6642.49  6643.82  6642.47  6643.63  0.104931                   
2018-10-05 19:24:00  6643.78  6645.31  6635.50  6640.02 -0.031497                   

1 个答案:

答案 0 :(得分:2)

您可以使用pd.Series.shift&运算符来组合两个布尔序列。

这将为行{em>和上一行都满足条件的行上的flag = 1的每个实例设置diff < 0.1

df['flag'] = (df['diff'].lt(0.1) & df['diff'].shift().lt(0.1)).astype(int)

可能更有效的方法是在单个比较中使用shift

s = df['diff'].lt(0.1)
df['flag'] = (s & s.shift()).astype(int)

结果:

print(df)

                        open     high      low    close      diff  flag
TimeStamp                                                              
2018-10-05 19:00:00  6637.90  6645.06  6637.17  6643.52 -0.057705     0
2018-10-05 19:03:00  6643.52  6650.00  6641.00  6649.99  0.002710     1
2018-10-05 19:06:00  6648.91  6650.00  6640.82  6642.85 -0.017769     1
2018-10-05 19:09:00  6642.85  6646.47  6642.00  6646.20  0.000000     1
2018-10-05 19:12:00  6646.20  6646.21  6642.00  6642.40  0.085065     1
2018-10-05 19:15:00  6641.00  6641.84  6636.35  6638.54 -0.024863     1
2018-10-05 19:18:00  6639.26  6643.38  6638.00  6640.00 -0.067340     1
2018-10-05 19:21:00  6642.49  6643.82  6642.47  6643.63  0.104931     0
2018-10-05 19:24:00  6643.78  6645.31  6635.50  6640.02 -0.031497     0