Python 遍历行以查看哪个值最先出现

Python 遍历行以查看哪个值最先出现,python,pandas,Python,Pandas,使用Pandas时,我可以使用.shift()检查前面和后面的行,以查看是否满足某些条件 如果我需要查看是否满足一个条件,即在我比较的行之后可能有100行或更多行?我知道在数据帧中循环不是最有效的,但是有人能帮我看一下下面的例子吗 当df['reversion']列有信号时-如下面14:00显示6.0的示例所示-我想知道在14:00行之后首先看到以下哪一项: df.price的值为df.reversion+1(我们可以看到它是在20:00被击中的,因为6+1=7) df.price的值为df.

使用Pandas时,我可以使用.shift()检查前面和后面的行,以查看是否满足某些条件

如果我需要查看是否满足一个条件,即在我比较的行之后可能有100行或更多行?我知道在数据帧中循环不是最有效的,但是有人能帮我看一下下面的例子吗

当df['reversion']列有信号时-如下面14:00显示6.0的示例所示-我想知道在14:00行之后首先看到以下哪一项:

  • df.price
    的值为
    df.reversion
    +1(我们可以看到它是在20:00被击中的,因为6+1=7)
  • df.price
    的值为
    df.reversion
    -
    df.reversion
    (本例中未命中该值,因为价格未命中6-6=0)

这是所需的输出,蓝色单元格显示了我希望看到的内容。新列应显示达到目标(根据本例)或未达到目标(如果本例中价格达到0)的时间

请参见下面的
df.to_dict()
以复制:

{'move_start': {datetime.time(9, 0): nan,
  datetime.time(10, 0): nan,
  datetime.time(11, 0): nan,
  datetime.time(12, 0): nan,
  datetime.time(13, 0): nan,
  datetime.time(14, 0): datetime.time(9, 0),
  datetime.time(15, 0): nan,
  datetime.time(16, 0): nan,
  datetime.time(17, 0): nan,
  datetime.time(18, 0): nan,
  datetime.time(19, 0): nan,
  datetime.time(20, 0): nan},
 'price': {datetime.time(9, 0): 1,
  datetime.time(10, 0): 2,
  datetime.time(11, 0): 3,
  datetime.time(12, 0): 4,
  datetime.time(13, 0): 5,
  datetime.time(14, 0): 6,
  datetime.time(15, 0): 5,
  datetime.time(16, 0): 4,
  datetime.time(17, 0): 3,
  datetime.time(18, 0): 2,
  datetime.time(19, 0): 4,
  datetime.time(20, 0): 7},
 'reversal': {datetime.time(9, 0): nan,
  datetime.time(10, 0): nan,
  datetime.time(11, 0): nan,
  datetime.time(12, 0): nan,
  datetime.time(13, 0): nan,
  datetime.time(14, 0): 6.0,
  datetime.time(15, 0): nan,
  datetime.time(16, 0): nan,
  datetime.time(17, 0): nan,
  datetime.time(18, 0): nan,
  datetime.time(19, 0): nan,
  datetime.time(20, 0): nan}}

让它变得更好更干净,想

import datetime,numpy as np,pandas as pd
nan = np.nan

a = pd.DataFrame({'move_start': {datetime.time(9, 0): nan,   datetime.time(10, 0): nan,   datetime.time(11, 0): nan,   datetime.time(12, 0): nan,   datetime.time(13, 0): nan,   datetime.time(14, 0): datetime.time(9, 0),   datetime.time(15, 0): nan,   datetime.time(16, 0): nan,   datetime.time(17, 0): nan,   datetime.time(18, 0): nan,   datetime.time(19, 0): nan,   datetime.time(20, 0): nan},  'price': {datetime.time(9, 0): 1,   datetime.time(10, 0): 0,   datetime.time(11, 0): 3,   datetime.time(12, 0): 4,   datetime.time(13, 0): 7,   datetime.time(14, 0): 6,   datetime.time(15, 0): 5,   datetime.time(16, 0): 4,   datetime.time(17, 0): 0,   datetime.time(18, 0): 2,   datetime.time(19, 0): 4,   datetime.time(20, 0): 7},  'reversal': {datetime.time(9, 0): nan,   datetime.time(10, 0): nan,   datetime.time(11, 0): nan,   datetime.time(12, 0): nan,   datetime.time(13, 0): nan,
  datetime.time(14, 0): 6.0,   datetime.time(15, 0): nan,   datetime.time(16, 0): nan,   datetime.time(17, 0): nan,   datetime.time(18, 0): nan,   datetime.time(19, 0): nan,   datetime.time(20, 0): nan}})


a['target_hit']=nan;
a['target_miss']=nan;
a['reversal1']=a['reversal']+1;
a['reversal2']=a['reversal']-a['reversal'];
a.sort_index(1,inplace=True);

hit = a.ix[:,:-2].dropna()

takeBoth = False
targetIsHit,targetIsMiss = False,False

if takeBoth:

    targetHit = a[(hit['reversal1'].values==a['price'].values) & (hit['reversal1'].index.values<a['price'].index.values)];
    targetMiss = a[(hit['reversal2'].values==a['price'].values) & (hit['reversal2'].index.values<a['price'].index.values)];

    targetIsHit,targetIsMiss = not targetHit.empty, not targetMiss.empty

else:

    targetHit = a[(hit['reversal1'].values==a['price'].values) & (hit['reversal1'].index.values<a['price'].index.values)];
    targetIsHit = not targetHit.empty
    if not targetIsHit:
         targetMiss = a[(hit['reversal2'].values==a['price'].values) & (hit['reversal2'].index.values<a['price'].index.values)]; 
         targetIsMiss = not targetMiss.empty

if targetIsHit:a.loc[hit.index.values,"target_hit"] = targetHit.index.values;
if targetIsMiss:a.loc[hit.index.values,"target_miss"] = targetMiss.index.values;

print '#'*50
print a
'''
##################################################
         move_start  price  reversal  reversal1  reversal2 target_hit  \
09:00:00        NaN      1       NaN        NaN        NaN        NaN   
10:00:00        NaN      0       NaN        NaN        NaN        NaN   
11:00:00        NaN      3       NaN        NaN        NaN        NaN   
12:00:00        NaN      4       NaN        NaN        NaN        NaN   
13:00:00        NaN      7       NaN        NaN        NaN        NaN   
14:00:00   09:00:00      6       6.0        7.0        0.0   20:00:00   
15:00:00        NaN      5       NaN        NaN        NaN        NaN   
16:00:00        NaN      4       NaN        NaN        NaN        NaN   
17:00:00        NaN      0       NaN        NaN        NaN        NaN   
18:00:00        NaN      2       NaN        NaN        NaN        NaN   
19:00:00        NaN      4       NaN        NaN        NaN        NaN   
20:00:00        NaN      7       NaN        NaN        NaN        NaN   

          target_miss  
09:00:00          NaN  
10:00:00          NaN  
11:00:00          NaN  
12:00:00          NaN  
13:00:00          NaN  
14:00:00          NaN  
15:00:00          NaN  
16:00:00          NaN  
17:00:00          NaN  
18:00:00          NaN  
19:00:00          NaN  
20:00:00          NaN
'''
导入日期时间,numpy作为np,pandas作为pd
nan=np.nan
a=pd.DataFrame({'move_start':{datetime.time(9,0):nan,datetime.time(10,0):nan,datetime.time(11,0):nan,datetime.time(12,0):nan,datetime.time(13,0):nan,datetime.time(14,0):datetime.time(9,0),datetime.time(15,0):nan,datetime.time(16,0):nan,datetime.time(17,0):nan,datetime.time.time(18,0):nan,datetime.time(19,0):nan,datetime.time(20,0):nan},'price':{datetime.time(9,0):1,datetime.time(10,0):0,datetime.time(11,0):3,datetime.time(12,0):4,datetime.time(13,0):7,datetime.time(14,0):6,datetime.time(15,0):5,datetime.time(16,0):4,datetime.time(17,0):0,datetime.time(18,0):2,datetime.time(19,0):4,datetime.time(20,0):7},'反转':{datetime.time(9,0):nan,datetime.time(10,0):nan,datetime.time(11,0):nan,datetime.time(12,0):nan,datetime.time(13,0):nan,
datetime.time(14,0):6.0,datetime.time(15,0):nan,datetime.time(16,0):nan,datetime.time(17,0):nan,datetime.time(18,0):nan,datetime.time(19,0):nan,datetime.time(20,0):nan})
a['target_hit']=nan;
a['target_miss']=nan;
a['reversal1']=a['reversal1']+1;
a['reversal2']=a['reversal']-a['reversal'];
a、 排序索引(1,原地=真);
hit=a.ix[:,:-2].dropna()
takeBoth=False
targetIsHit,targetIsMiss=False,False
如果两者都有:

targetHit=a[(点击['reversal1'].values==a['price'].values)&(点击['reversal1'].index.valuesHi Robert,看起来您的代码已经解决了这个问题,但不幸的是,当我将
10:00
a.price
单元格更改为
0
时,您的代码会向后查看,并将其用作
目标。\u miss
。重要的是只考虑未来的行。您能看一下吗?感谢您的帮助。还有我需要将第一个
if not
更改为
if
以获得如下任何输出:
if targetMiss.empty:a.loc[hit.index.values,“target\u hit”]=targetHit.index.values;
这是否正确?啊,我当时正在睡觉xD…w8我会检查它有错误…如果不是targetHit:…
应该是
,如果不是targetMiss:…
我正在复制行
如果不是targetMiss:…
以生成行
如果不是targetHit:…
并正确地更改了所有内容,但不是
targetMiss
targetHit
…但目标命中是否仅为目标命中后的未命中,而不是命中后的未命中?了解其他人如何执行此任务也很有意思。