有没有比较pandas DataFrame的同一列中的值?
手头的任务是这样的:
import pandas as pd
data = pd.DataFrame({"A": [0,-5,2,3,-3,-4,-4,-2,-1,5,6,7,3,-1]});
我需要找到连续+/-值出现的最大时间(在索引中)(等效地检查连续值,因为符号可以用True / False编码)。上述数据应该产生5,因为有5个连续的负整数[-3,-4,-4,-2,-1]
如果可能的话,我希望避免使用循环,因为列中的数据点数量可能会超过数百万。
我已尝试使用data.A.rolling()
及其变种,但似乎无法以矢量化的方式找出任何可能的方法。
有什么建议吗?
答案 0 :(得分:2)
这是一种NumPy方法,用于计算正值和负值的最大间隔长度 -
def max_interval_lens(arr):
# Store mask of positive values
pos_mask = arr>=0
# Get indices of shifts
idx = np.r_[0,np.flatnonzero(pos_mask[1:] != pos_mask[:-1])+1, arr.size]
# Return max of intervals
lens = np.diff(idx)
s = int(pos_mask[0])
maxs = [0,0]
if len(lens)==1:
maxs[1-s] = lens[0]
else:
maxs = lens[1-s::2].max(), lens[s::2].max()
return maxs # Positive, negative max lens
示例运行 -
In [227]: data
Out[227]:
A
0 0
1 -5
2 2
3 3
4 -3
5 -4
6 -4
7 -2
8 -1
9 5
10 6
11 7
12 3
13 -1
In [228]: max_interval_lens(data['A'].values)
Out[228]: (4, 5)