我很难用正确的词来表达我的问题,所以谢谢您阅读我的问题。
我有一个数据框,它有两列high
,low
,它们记录了
较高和较低的值。
例如:
high low
0 NaN NaN
1 100.0 NaN
2 NaN 50.0
3 110.0 NaN
4 NaN NaN
5 120.0 NaN
6 100.0 NaN
7 NaN NaN
8 NaN 30.0
9 NaN NaN
10 NaN 20.0
11 NaN NaN
12 110.0 NaN
13 NaN NaN
我想合并连续的(在同一侧),并保留最高的(最低)。
“连续的”表示high
列中两个值之间的low
列中的值,或{{1}中两个值之间的low
列中的值}}列
应该合并索引high
,3
,5
的高值,索引6
的最大值(值5
)应该合并被留下。
索引120
,8
的低值应合并,索引10
的最低值(值10
)应合并。
结果是这样的:
20
我试图编写一个for循环来处理数据,但是当数据很大(超过10,000个)时,速度非常慢。
代码是:
high low
0 NaN NaN
1 100.0 NaN
2 NaN 50.0
3 NaN NaN
4 NaN NaN
5 120.0 NaN
6 NaN NaN
7 NaN NaN
8 NaN NaN
9 NaN NaN
10 NaN 20.0
11 NaN NaN
12 110.0 NaN
13 NaN NaN
有什么有效的方法吗?
谢谢
答案 0 :(得分:0)
对于像这样的面向行的迭代处理,熊猫通常做得不好,或者更确切地说根本没有效率。但是您始终可以直接处理基础的numpy数组:
import pandas as pd
import numpy as np
data=pd.DataFrame(dict(high=[None,100,None,110,None,120,100,None,None,None,None,None,110,None],
low=[None,None,50,None,None,None,None,None,30,None,20,None,None,None]))
npdata = data.values
flag = None
flag_index = None
for i in range(len(npdata)):
if not np.isnan(npdata[i][0]):
if flag == 'flag_high':
if npdata[i][0] > npdata[flag_index][0]:
npdata[flag_index][0] = np.nan
flag_index = i
else:
npdata[i][0] = np.nan
else:
flag = 'flag_high'
flag_index = i
elif not np.isnan(npdata[i][1]):
if flag == 'flag_low':
if npdata[i][1] < npdata[flag_index][1]:
npdata[flag_index][1] = np.nan
flag_index = i
else:
npdata[i][1] = np.nan
else:
flag = 'flag_low'
flag_index = i
在我的测试中,速度快了将近10倍。
数据帧越大,增益越高:在1500行中,直接使用numpy数组的速度快30倍。