我正在尝试找到最快的解决方案,以遍历每行打开高位低位关闭数据,并计算出当前行高点与下一个大于或等于原始高点之间的行数。这是一个简化的代码示例,我认为它可以很好地解释它(我将尝试查找#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main() {
vector<string> fruits;
fruits.push_back("Apple");
fruits.push_back("Banana");
for(int i = 0; i<fruits.size(); i++){
for(auto& c : fruits[i])
{
c = tolower(c);
}
cout << fruits[i] << endl;
}
}
的最终值):
_next
我认为我需要在for i in df.index:
while df.loc[i, 'high'] > df.loc[_next, 'high']:
_next += 1
内使用lambda
函数,但似乎无法正确执行。几天来一直在努力解决这个问题,希望您能提出任何建议!
使用此数据,该函数应返回apply
[2, 0, 0, 3, 1, 0, 0]
编辑:itertuples(name = None,index = True)是到目前为止最快的方法。
答案 0 :(得分:0)
根据我的理解,我们可以从当前行中减去所有值,然后获得上三阶值,并在值大于0时使用argmax
获得索引最大值
样品:
s
0 1
1 2
2 1
3 3
4 1
5 1
6 5
dtype: int64
解决方案:
np.clip(np.triu((s.values-s.values[:,None])>0,0).argmax(1)-np.arange(len(s)),a_min=0, a_max=None)
array([1, 2, 1, 3, 2, 1, 0])
答案 1 :(得分:0)
使用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