如何在Python中使用嵌套的if和循环对代码进行矢量化?
我有一个如下所示的数据帧如何在Python中使用嵌套的if和循环对代码进行矢量化?,python,python-3.x,pandas,vectorization,pandas-groupby,Python,Python 3.x,Pandas,Vectorization,Pandas Groupby,我有一个如下所示的数据帧 df=pd.DataFrame({ “主题id”:[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2], “日”:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,1,2,3,4,5,6,7,8,9,10,11,12,14,15,17,19,20], "PEEP":[7,5,10,10
df=pd.DataFrame({
“主题id”:[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],
“日”:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,1,2,3,4,5,6,7,8,9,10,11,12,14,15,17,19,20],
"PEEP":[7,5,10,10,11,11,14,17,17,21,23,25,25,22,20,26,5,7,8,8,9,13,13,15,15,12,15,15,19,19,22,15]
})
df['fake_flag']='
在这个操作中,我正在执行一个如下代码所示的操作。这段代码运行良好,并产生预期的输出,但我不能对实际数据集使用这种方法,因为它有超过百万条记录
t1=df['PEEP']
对于t1.index中的i:
如果i>=2:
打印(“当前值为”,t1[i])
打印(“前1(n-1)”,t1[i-1])
打印(“前二(n-2)”,t1[i-2])
如果(t1[i-1]==t1[i-2]或t1[i-2]>=t1[i-1]):
r1_output=t1[i-2]#我们得到这两个值的最大值(t1[i-2]),它的常数(t1[i-2]或t1[i-1])将具有相同的值并不重要
打印(“规则1输出为”,r1\U输出)
如果t1[i]>=r1\u输出+3:
打印(“找到规则2的值”,t1[i])
打印(“检查下一个值是否与当前值相同”,t1[i+1])
如果(t1[i]==t1[i+1]):
打印(“正在设置伪标志”)
df['fake_flag'][i]='fake_vac'
然而,我无法将此应用于实际数据,因为它有超过百万条记录。我正在学习Python,您能帮助我理解如何用Python对代码进行矢量化吗
你可以参考这篇文章来理解逻辑。由于逻辑正确,我创建这篇文章主要是为了寻求对代码进行矢量化和紧固的帮助
我希望我的输出如下所示
受试者id=1
受试者id=2
有没有什么有效而优雅的方法来加快我对一百万条记录数据集的代码操作这行得通吗
df.groupby('subject_id')\
.rolling(3)['PEEP'].apply(lambda x: (x[-1] - x[:2].max()) >= 3, raw=True).fillna(0).astype(bool)
输出:
subject_id
1 0 False
1 False
2 True
3 False
4 False
5 False
6 True
7 False
8 True
9 False
10 True
11 False
12 False
13 False
14 False
15 False
16 False
17 False
18 True
19 False
2 20 False
21 False
22 False
23 False
24 False
25 False
26 True
27 False
28 False
29 False
30 False
31 False
32 True
33 False
34 True
35 False
36 False
37 True
38 False
39 False
Name: PEEP, dtype: bool
细节:
- 使用
使用'subject\u id'来分解数据groupby
- 在n=3或窗口大小为3的情况下应用
rolling
- 使用-1索引和子动作查看该窗口中的最后一个值 使用索引的窗口中前两个值的最大值 切片
矢量化,并将它们组合在一起
con1 = t1.shift(2).ge(t1.shift(1))
con2 = t1.ge(t1.shift(2).add(3))
con3 = t1.eq(t1.shift(-1))
df['fake_flag']=np.where(con1 & con2 & con3,'fake VAC','')
编辑(按主体分组)
t1
与df
相同?如果您提供了输出视图,并对您试图更新的内容进行了文本描述,则更新了post@akashkumar在第5列中提供值'fake VAC'
的逻辑是什么?我认为numpy.where()
可以在这里使用。哇,你太棒了。你介意给我这样的初学者讲一些细节吗。我想这是可行的。我能够在所有正确的地方看到True
,如果您可以将其分解,我可以逐段执行以实际理解并应用您按主题id分组的不同数据(真实数据),然后使用三个值的窗口滚动。。。取该窗口中的最后一个值,并从窗口中前两个值的最大值中减去if。检查是否大于3。但还必须检查下一个值(n+1
)。你用n
检查n-1
和n-2
,然后还要确保n
和n+1
是相同的。如果你看到我的输出截图,你会有一个想法,我希望这会有帮助哇,太棒了。不知道会这么简单。非常感谢您的时间。我认为您还需要申请groupby以防止主题1和主题2混合。@Mark Wang-您介意用groupby更新您的答案以对其他人也有用吗?是的,我们需要根据每个主题来确定。谢谢你的帮助。非常感谢,略有不同。看看你是否能找到不同的答案。con=lambda x:(x['PEEP'].shift(2).ge(x['PEEP'].shift(1))&(x['PEEP'].ge(x['PEEP'].shift(2).add(3))&(x['PEEP2'].eq(x['PEEP2'].shift(-1))
,df['fake\u标志]]=df.groupby('subject\u id').apply(con.map.)。map({True:'VAC',fake:'fake'''=True:'index}.0,drop>
con = lambda x: (x.shift(2).ge(x.shift(1))) & (x.ge(x.shift(2).add(3))) & (x.eq(x.shift(-1)))
df['fake_flag'] = df.groupby('subject_id')['PEEP'].transform(con).map({True:'fake VAC',False:''})