我想寻找有效的方法来查找满足数据帧中某些条件的行。数据框有 n 行和 3 列。值为-1
or0
或1
。
我想找到满足两个条件的行。
我使用循环方法遍历所有行并找到满足条件的行。但是,这不是一种有效的方法,尤其是当有一个大数据框并且这一步只是第一步时。
# Given a dataframe (n*3)
randNum=random.choices(range(-1,2),k=333) # k=3*int
frame=pd.DataFrame(np.array(randNum).reshape(-1,3))
# its values = -1,0,1, like this:
# In [126]:frame
# Out[126]:
# 0 1 2
# 0 1 0 0
# 1 1 -1 1
# 2 1 1 1
# 3 -1 -1 1
# 4 -1 0 -1
# 5 1 1 -1
# ...
# 105 -1 -1 -1
# 106 -1 -1 0
# 107 -1 -1 0
# 108 0 -1 1
# 109 -1 0 1
# 110 1 0 1
# I want find the row(s) that all of the values of
# columns('0','1','2')!=-1, and while the value of
# the diagonal of next three rows =1, like this:
# 0 1 2
# row0 v1 v2 v3 # v1!=v2!=v3!=-1, it may be 1 or 0.
# row1 1 v v
# row2 v 1 v # v =-1 or 0 or 1
# row3 v v 1
# the diagonal of rows (row1,row2,row3)=1
我想在 DataFrame 中找到 row0。可以通过loop方法解决,但是有没有有效的解决方法?非常感谢 !
您可以使用布尔掩码来表示每个单独的条件。第一个很简单:
c1_mask = frame[0] != -1
# edited version:
c1_mask = (frame!=-1).all(axis=1)
第二个可以通过卷积运算解决
from scipy.signal import convolve2d
c2_mask = convolve2d(frame.values, np.eye(3), mode='valid')
c2_mask = (np.vstack([c2_mask, np.zeros((3, 1))]) == 3).reshape(-1)
# edited version:
c2_kernal = np.vstack((np.zeros((1,3)), np.eye(3)))
c2_mask = convolve2d(frame.values, c2_kernal, mode='valid')
c2_mask = (c2_mask == 3).reshape(-1)
然后将它们组合起来:
frame[c1_mask & c2_mask]
# edited version:
(frame[:-3])[(c1_mask[:-3]).shift[-1] & c2_mask]
请注意,在此解决方案中,列数只是一个参数,因此可以轻松扩展。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句