Python 熊猫:根据条件将数据帧中的值复制到多行

Python 熊猫:根据条件将数据帧中的值复制到多行,python,pandas,Python,Pandas,我需要分析pandas数据帧中的一个价格序列,以确定两个连续的较低低点的出现,这将创建一个我们称之为NLBL的价格水平。我可以用一个简单的条件(见下文)来实现这一点,但我需要的不是真值,而是前三个烛光的值。另外,我还需要将同一关卡再复制四次 以下是一些示例数据: Date Time Open High Low Close datetime

我需要分析pandas数据帧中的一个价格序列,以确定两个连续的较低低点的出现,这将创建一个我们称之为NLBL的价格水平。我可以用一个简单的条件(见下文)来实现这一点,但我需要的不是真值,而是前三个烛光的值。另外,我还需要将同一关卡再复制四次

以下是一些示例数据:

        Date      Time     Open     High      Low    Close
datetime                                                                     
2019-01-22 11:00:00  2019-01-22  11:00:00  2643.99  2647.47  2634.73  2634.73
2019-01-22 12:00:00  2019-01-22  12:00:00  2634.79  2638.55  2632.69  2635.94
2019-01-22 13:00:00  2019-01-22  13:00:00  2635.95  2636.35  2623.30  2631.93
2019-01-22 14:00:00  2019-01-22  14:00:00  2631.92  2632.29  2618.33  2622.66
2019-01-22 15:00:00  2019-01-22  15:00:00  2622.71  2632.90  2617.27  2625.49
2019-01-22 16:00:00  2019-01-22  16:00:00  2625.58  2633.81  2625.58  2633.81
2019-01-23 09:00:00  2019-01-23  09:00:00  2643.48  2652.44  2643.48  2650.97
2019-01-23 10:00:00  2019-01-23  10:00:00  2651.00  2653.19  2632.85  2634.47
2019-01-23 11:00:00  2019-01-23  11:00:00  2634.47  2638.55  2617.36  2617.46
2019-01-23 12:00:00  2019-01-23  12:00:00  2617.47  2627.43  2612.86  2627.31
2019-01-23 13:00:00  2019-01-23  13:00:00  2627.31  2631.70  2621.62  2629.92
2019-01-23 14:00:00  2019-01-23  14:00:00  2629.93  2635.26  2625.34  2629.21
2019-01-23 15:00:00  2019-01-23  15:00:00  2629.25  2639.22  2628.71  2636.61
2019-01-23 16:00:00  2019-01-23  16:00:00  2636.71  2639.54  2636.71  2638.60
2019-01-24 09:00:00  2019-01-24  09:00:00  2638.84  2641.03  2631.06  2636.14
2019-01-24 10:00:00  2019-01-24  10:00:00  2636.18  2647.20  2633.12  2640.49
2019-01-24 11:00:00  2019-01-24  11:00:00  2640.31  2645.37  2633.60  2644.08
2019-01-24 12:00:00  2019-01-24  12:00:00  2644.14  2644.42  2632.79  2634.31
2019-01-24 13:00:00  2019-01-24  13:00:00  2634.34  2635.16  2627.01  2633.62
2019-01-24 14:00:00  2019-01-24  14:00:00  2633.64  2638.47  2630.96  2637.04
2019-01-24 15:00:00  2019-01-24  15:00:00  2637.03  2643.21  2636.46  2642.66
2019-01-24 16:00:00  2019-01-24  16:00:00  2642.63  2643.10  2641.97  2641.99
2019-01-25 09:00:00  2019-01-25  09:00:00  2657.44  2663.57  2657.33  2661.64
2019-01-25 10:00:00  2019-01-25  10:00:00  2661.60  2671.61  2661.60  2669.49
2019-01-25 11:00:00  2019-01-25  11:00:00  2669.47  2670.50  2664.18  2669.13
2019-01-25 12:00:00  2019-01-25  12:00:00  2669.12  2672.38  2661.39  2664.88
2019-01-25 13:00:00  2019-01-25  13:00:00  2664.88  2668.49  2663.76  2667.93
2019-01-25 14:00:00  2019-01-25  14:00:00  2667.95  2669.12  2661.14  2665.27
2019-01-25 15:00:00  2019-01-25  15:00:00  2665.27  2666.52  2658.75  2663.06
2019-01-25 16:00:00  2019-01-25  16:00:00  2662.98  2664.74  2661.64  2664.14
我已经走了这么远:

min_data['NLBL'] = (min_data['Low'] < min_data['Low'].shift(1)) & (min_data['Low'].shift(1) < min_data['Low'].shift(2))
min_data['NLBL'] = min_data['NLBL'].shift(periods=1) # shifting downward as the trigger is valid after the close
print("\nResult:\n %s" % min_data.tail(30))

Result:
            Date      Time     Open     High      Low    Close  \
datetime                                                                        
2019-01-22 11:00:00  2019-01-22  11:00:00  2643.99  2647.47  2634.73  2634.73   
2019-01-22 12:00:00  2019-01-22  12:00:00  2634.79  2638.55  2632.69  2635.94   
2019-01-22 13:00:00  2019-01-22  13:00:00  2635.95  2636.35  2623.30  2631.93   
2019-01-22 14:00:00  2019-01-22  14:00:00  2631.92  2632.29  2618.33  2622.66   
2019-01-22 15:00:00  2019-01-22  15:00:00  2622.71  2632.90  2617.27  2625.49   
2019-01-22 16:00:00  2019-01-22  16:00:00  2625.58  2633.81  2625.58  2633.81   
2019-01-23 09:00:00  2019-01-23  09:00:00  2643.48  2652.44  2643.48  2650.97   
2019-01-23 10:00:00  2019-01-23  10:00:00  2651.00  2653.19  2632.85  2634.47   
2019-01-23 11:00:00  2019-01-23  11:00:00  2634.47  2638.55  2617.36  2617.46   
2019-01-23 12:00:00  2019-01-23  12:00:00  2617.47  2627.43  2612.86  2627.31   
2019-01-23 13:00:00  2019-01-23  13:00:00  2627.31  2631.70  2621.62  2629.92   
2019-01-23 14:00:00  2019-01-23  14:00:00  2629.93  2635.26  2625.34  2629.21   
2019-01-23 15:00:00  2019-01-23  15:00:00  2629.25  2639.22  2628.71  2636.61   
2019-01-23 16:00:00  2019-01-23  16:00:00  2636.71  2639.54  2636.71  2638.60   
2019-01-24 09:00:00  2019-01-24  09:00:00  2638.84  2641.03  2631.06  2636.14   
2019-01-24 10:00:00  2019-01-24  10:00:00  2636.18  2647.20  2633.12  2640.49   
2019-01-24 11:00:00  2019-01-24  11:00:00  2640.31  2645.37  2633.60  2644.08   
2019-01-24 12:00:00  2019-01-24  12:00:00  2644.14  2644.42  2632.79  2634.31   
2019-01-24 13:00:00  2019-01-24  13:00:00  2634.34  2635.16  2627.01  2633.62   
2019-01-24 14:00:00  2019-01-24  14:00:00  2633.64  2638.47  2630.96  2637.04   
2019-01-24 15:00:00  2019-01-24  15:00:00  2637.03  2643.21  2636.46  2642.66   
2019-01-24 16:00:00  2019-01-24  16:00:00  2642.63  2643.10  2641.97  2641.99   
2019-01-25 09:00:00  2019-01-25  09:00:00  2657.44  2663.57  2657.33  2661.64   
2019-01-25 10:00:00  2019-01-25  10:00:00  2661.60  2671.61  2661.60  2669.49   
2019-01-25 11:00:00  2019-01-25  11:00:00  2669.47  2670.50  2664.18  2669.13   
2019-01-25 12:00:00  2019-01-25  12:00:00  2669.12  2672.38  2661.39  2664.88   
2019-01-25 13:00:00  2019-01-25  13:00:00  2664.88  2668.49  2663.76  2667.93   
2019-01-25 14:00:00  2019-01-25  14:00:00  2667.95  2669.12  2661.14  2665.27   
2019-01-25 15:00:00  2019-01-25  15:00:00  2665.27  2666.52  2658.75  2663.06   
2019-01-25 16:00:00  2019-01-25  16:00:00  2662.98  2664.74  2661.64  2664.14   

          NLBL  
datetime                    
2019-01-22 11:00:00   True  
2019-01-22 12:00:00   True  
2019-01-22 13:00:00   True  
2019-01-22 14:00:00   True  
2019-01-22 15:00:00   True  
2019-01-22 16:00:00   True  
2019-01-23 09:00:00  False  
2019-01-23 10:00:00  False  
2019-01-23 11:00:00  False  
2019-01-23 12:00:00   True  
2019-01-23 13:00:00   True  
2019-01-23 14:00:00  False  
2019-01-23 15:00:00  False  
2019-01-23 16:00:00  False  
2019-01-24 09:00:00  False  
2019-01-24 10:00:00  False  
2019-01-24 11:00:00  False  
2019-01-24 12:00:00  False  
2019-01-24 13:00:00  False  
2019-01-24 14:00:00   True  
2019-01-24 15:00:00  False  
2019-01-24 16:00:00  False  
2019-01-25 09:00:00  False  
2019-01-25 10:00:00  False  
2019-01-25 11:00:00  False  
2019-01-25 12:00:00  False  
2019-01-25 13:00:00  False  
2019-01-25 14:00:00  False  
2019-01-25 15:00:00  False  
2019-01-25 16:00:00   True
如果它在“NLBL”列中找到一个具有真值的行,它将向后计数三行,获取“High”值并用该值替换真值。然后将相同的“高”值复制到以下四行

但是,如果它发现一个新的TRUE,它将停止向前复制并使用新的高值


希望这是有意义的。

感谢您的澄清,我很确定我理解了您的意思(尽管如果我理解正确,那么示例输出中会有一个小错误)

我的解决方案是:基本上添加一个helper列,将0替换为
NaN
(如果性能是一个严重问题,您可以查看
map
,而不是
replace
),并使用两种
fillna
方法:

min_data['helper'] = min_data['High'].shift(3)
min_data.loc[min_data['NLBL'] == True, 'NLBL'] = min_data.loc[min_data['NLBL'] == True, 'helper']
min_data = min_data.drop(columns=['helper'])
min_data.NLBL = min_data.NLBL.replace(False, np.nan)
min_data['NLBL'] = min_data['NLBL'].fillna(method='ffill', limit=4)
min_data['NLBL'] = min_data['NLBL'].fillna(0)

你能澄清你所说的“Hight.Shift(3)-基本上是系列中的最高低点”是什么意思吗?你能发布期望的结果来帮助澄清上述评论吗?2再向前四次?好的,谢谢你的快速回复@我的意思是,它应该显示4行后面的高值,而不是真值。因此,对于具有16:00时间戳的最后一行,它将显示2668.49(13:00)高。希望这是有意义的。@Parfait-我已经添加了您要求的示例输出,并提供了更多的评论,希望这些评论能够澄清任何问题。提前感谢您的帮助。嗯……有了第一块数据,我无法用精确的代码重现您的第二块结果。点击这个按钮。一定要设置一个。这是一个非常棒和聪明的解决方案!!很好:-)很明显,loc电话是做重物的。我将更详细地研究这一部分,以了解您是如何做到这一点的。其余的是水晶。再次感谢。很高兴你喜欢它-如果你的问题得到解决,你可以标记绿色勾号:)我找到了。我喜欢使用loc为NLBL列创建掩码,然后将移位的高值指定给它。我试着用简单的比较,但效果不太好。你真的救了我一天,非常感谢/
min_data['helper'] = min_data['High'].shift(3)
min_data.loc[min_data['NLBL'] == True, 'NLBL'] = min_data.loc[min_data['NLBL'] == True, 'helper']
min_data = min_data.drop(columns=['helper'])
min_data.NLBL = min_data.NLBL.replace(False, np.nan)
min_data['NLBL'] = min_data['NLBL'].fillna(method='ffill', limit=4)
min_data['NLBL'] = min_data['NLBL'].fillna(0)