Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中使用嵌套的if和循环对代码进行矢量化?_Python_Python 3.x_Pandas_Vectorization_Pandas Groupby - Fatal编程技术网

如何在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
细节:
  • 使用
    groupby
    使用'subject\u id'来分解数据
  • 在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:''})