Python 在数据帧中查找范围中的值
我有一个数据框和一个名为Python 在数据帧中查找范围中的值,python,pandas,Python,Pandas,我有一个数据框和一个名为BOL的列。此值介于2.0和-2.0之间。我试图找到,一旦BOL值达到0,在当前行之后的10行中它是否达到1.0。并想找出BOL值为0后达到1.0的行数 以下是数据帧: import pandas as pd df = pd.DataFrame({'BOL': [-1.21, -1.35, -1.1, -0.84, -0.01, 0.09, -0.45, 0.78, 1.45, 1.78, 0.33, -0.96]
BOL
的列。此值介于2.0和-2.0之间。我试图找到,一旦BOL值达到0,在当前行之后的10行中它是否达到1.0。并想找出BOL值为0后达到1.0的行数
以下是数据帧:
import pandas as pd
df = pd.DataFrame({'BOL': [-1.21, -1.35, -1.1, -0.84, -0.01, 0.09,
-0.45, 0.78, 1.45, 1.78, 0.33, -0.96]})
这是使用
numpy
的一种方法:
import numpy as np
A = df['BOL'].values
start = np.where(A>=0)[0][0] # 5
end = np.where(A[start:]>=1)[0][0] + start # 8
res = end - start # 3
如果您希望得到结果,但可能没有有效的开始
或结束
索引,则可以使用尝试
/进行换行,但
除外:
try:
start = np.where(A>=0)[0][0]
end = np.where(A[start:]>=1)[0][0] + start
res = end - start
except IndexError:
res = np.nan
然后,您可以执行一个简单的比较,即
res,这里有一种不同的方法,我们创建一个函数来接受数组,并将其转换为迭代器。如果找到>=0
值,它将再运行10次迭代,寻找>=1
以返回真
。ElseFalse
import pandas as pd
df = pd.DataFrame({
'BOL': [-1.21, -1.35, -1.1, -0.84, -0.01, 0.09,
-0.45, 0.78, 0.45, 0.78, 0.33, -0.96]
})
def findnextoccur(ar, n=10):
it = np.nditer(ar)
f = next(it)
while f < 0:
try:
f = next(it)
except StopIteration:
return False
for _ in range(n):
try:
f = next(it)
if f >= 1.0:
return True
except StopIteration:
return False
findnextoccur(df['BOL'])
将熊猫作为pd导入
df=pd.DataFrame({
‘BOL’:[-1.21、-1.35、-1.1、-0.84、-0.01、0.09、,
-0.45, 0.78, 0.45, 0.78, 0.33, -0.96]
})
def FindNextocur(ar,n=10):
it=np.nditer(ar)
f=下一个(it)
当f<0时:
尝试:
f=下一个(it)
除停止迭代外:
返回错误
对于范围内的u(n):
尝试:
f=下一个(it)
如果f>=1.0:
返回真值
除停止迭代外:
返回错误
FindNextocur(df['BOL'])
10行中的0-->1.0应该是一次还是多次?实际上这并不重要。如果BOL在10行中最多达到0,我只是想将数字设置为新行。当然可以,但如果没有值,这将失败。@AntonvBR,是的,当然。我们确实需要OP提供更多信息。我会用尝试/,除非用户希望得到结果。很好的一次性解决方案,+1。值得注意的是,我相信对于少量的迭代,即f
0,这种方法会更好地工作。但可能会很贵。谢谢你的代码。那么,如果该行未达到10行中的1,我如何将该行添加到一个新列,如df['X10']=1或0?将值False更改为0,将值True更改为1。@DonCoder您可以:df['X10']=int(findnexoccur(df['BOL'])