我正在尝试找到最快的解决方案来迭代每一行开盘高低收盘数据,并计算出当前行的最高价与下一个最高价之间有多少行大于或等于原始值。这是一个简化的代码示例,我认为它很好地解释了这一点(我会尝试找到的最终值_next):
_next
for i in df.index: while df.loc[i, 'high'] > df.loc[_next, 'high']: _next += 1
我觉得我需要使用一个lambda内部函数apply,但似乎做不到。我花了好几天时间才弄清楚,希望能得到任何建议!
lambda
apply
使用此数据,函数应该返回[2, 0, 0, 3, 1, 0, 0]
[2, 0, 0, 3, 1, 0, 0]
d = {'high': [1.2, 1.1, 1.1, 1.4, 1.3, 1.2, 1.3]} df = pd.DataFrame(data=d) high rows_to_higher_high 0 1.2 2 1 1.1 0 2 1.1 0 3 1.4 3 4 1.3 1 5 1.2 0 6 1.3 0
编辑:itertuples(name=None,index=True)是迄今为止最快的方法。
使用list comprehension 并获取index to list
list comprehension
index to list
In [166]: d = {'high': [1.2, 1.1, 1.1, 1.4, 1.3, 1.2, 1.3]} In [167]: df = pd.DataFrame(data=d) In [168]: df['rows_to_higher_high']=[(df['high'].values[i+1:]>=val).tolist().index(True) if True in (df['high'].values[i+1:]>=val).tolist() else le ...: n((df['high'].values[i+1:]>=val).tolist()) for i, val in enumerate(df['high'].values)] In [169]: df Out[169]: high rows_to_higher_high 0 1.2 2 1 1.1 0 2 1.1 0 3 1.4 3 4 1.3 1 5 1.2 0 6 1.3 0