Python 在符合特定条件的数据帧中查找数字序列

Python 在符合特定条件的数据帧中查找数字序列,python,pandas,dataframe,sequence,Python,Pandas,Dataframe,Sequence,假设我们有一个dataframe列,如下所示: import pandas as pd import numpy as np x = np.linspace(1, 25, num=25) df=pd.DataFrame(np.sin(x)* np.random.randint(10,50),columns=['Curve']) df2=pd.DataFrame(np.linspace(4,5,num=5)) df = df['Curve'].append(df2) df.index=(range

假设我们有一个dataframe列,如下所示:

import pandas as pd
import numpy as np
x = np.linspace(1, 25, num=25)
df=pd.DataFrame(np.sin(x)* np.random.randint(10,50),columns=['Curve'])
df2=pd.DataFrame(np.linspace(4,5,num=5))
df = df['Curve'].append(df2)
df.index=(range(len(df)))

现在让我们假设我们想通过查找五个数字的序列来定位我们附加到原始数据帧的五个数字,所有这些数字之间都有增量差异,即下面的代码片段应该满足您的要求。首先,检查除前一行之外是否有小于1.0的行。要捕获组的第一行,请对下一行执行相同的操作。将这些与组合起来,并再次使用shift创建组号

最后,过滤到我们创建的具有所有“真”值的组;也就是说,组中的每个值都在其邻居中。一旦我们有了所有积极的群体,就选择最大的群体(不一定是五个人的群体)。一旦我们得到组号,就从原始df返回这些行

df.columns = ['curve']
a = abs(df.curve - df.curve.shift()) < 1.0    
b = abs(df.curve - df.curve.shift(-1)) < 1.0  
c = np.logical_or(a, b)                       
d = (c != c.shift()).cumsum()                 
df['c'] = c
df['d'] = d

df = df.groupby(d).filter(lambda x: all(x['c']))
max_group = df.loc[df.groupby(d).cumcount().idxmax()]['d']

df_added = df.loc[df['d'] == max_group]
df.columns=['curve']
a=abs(df.curve-df.curve.shift())<1.0
b=abs(df.curve-df.curve.shift(-1))<1.0
c=np.逻辑或(a,b)
d=(c!=c.shift()).cumsum()
df['c']=c
df['d']=d
df=df.groupby(d).filter(lambda x:all(x['c']))
max_group=df.loc[df.groupby(d.cumcount().idxmax()][d']
df_added=df.loc[df['d']==max_group]

编辑:我还应该注意,在对原始问题的评论中提出的问题是有效的。

您是说要返回每个5个数字系列,其中每个数字之间的增量差小于1?不太清楚您想要找到什么。@安德鲁,是的,这正是我想要的。这可能是安全的,只要OPs
我尝试了您的代码,但得到了以下错误代码“ValueError:Grouper for''not 1-dimensional“。你能更详细地解释一下为什么要添加这个部分吗?
d=(c!=c.shift()).cumsum()
?求累计和有什么价值?另外,使用np.logical_和不是更好吗?既然我们需要两个条件都成立,你能把a、b和c的样子作为你错误的背景吗?您发布的摘录是为观察值指定数字组。不,您不需要
逻辑和
;使用它,您将失去组中的第一个和最后一个成员。