反手就是一个优雅的loop—— python 中的for循环

2020-04-23  本文已影响0人  致知_5974

我现在有一个pandas的dataframe,metadata1,它长这样:


WeChat Screenshot_20200422220836.png

里面的celltype 储存着我需要的细胞分类信息,我想把来自中胚层的集中细胞都提取出来,我用以下代码提取出来了心肌细胞:

metadata1["Cardio"]=pd.Series(metadata1['celltype']=="Cardiomyocytes")
metadata2 = pd.DataFrame(np.array(metadata1)[np.array([cell == True for cell in metadata1['Cardio']]),:])

因为celltype的元素是str,我先把他们通过判断变成了bool,储存了新的一列,cardio,然后通过bool的True把心肌细胞提取出来

我现在想把里面的来自中胚层的细胞都提出来,我觉得我应该通过循环来做(但是我实际上不会写循环)
我先做了一个list,然后把中胚层的细胞名都放了进去(这个还是会的)

b=["Nascent mesoderm","Mixed mesoderm","Intermediate mesoderm","Caudal mesoderm","Paraxial mesoderm","Somitic mesoderm","Pharyngeal mesoderm","Cardiomyocytes","Allantois","ExE mesoderm"]

然后我就不知道该如何进行了。。。
我觉得我应该对metadata1['celltype']里的每一个变量值都做一个判断是不是在list b里面,把判断的bool值储存在一个list里面,然后就可以按照提取心肌细胞的方法提取中胚层细胞了。
问题的简化版:

a= ["sunny","cloudy","bigday"]
b=["sunny","rough"]

判断list a中的元素是否在b中,并将判断值储存为一个新的list。

x = [ ]
for i in range(0,3):
    if a[i] in b:
        x.append(True)    
    else:
        x.append(False)
print(x)

print的结果为:

[True, False, False]

按照这个思路,解决我的问题就变成了

x=[]
for i in range(0,116312):
    if metadata1["celltype"][i] in b:
        x.append(True)        
    else:
        x.append(False)             
print(x)  

它work,但是依然非常不优雅,而且速度很慢。
第二天一早我去问我的PI(小天使),PI大人告诉了我他的写法

celltypes=["Nascent mesoderm","Mixed mesoderm","Intermediate mesoderm","Caudal mesoderm","Paraxial mesoderm","Somitic mesoderm","Pharyngeal mesoderm","Cardiomyocytes","Allantois","ExE meso
mesoderm_bool=[0]*116312
for celltype in celltypes:
     mesoderm_bool = mesoderm_bool | (metadata1["celltype"]==celltype)
print(mesoderm_bool)

速度非常快,PI大人(小天使)还教导我给变量起名字不能瞎起x,a,b这类的,要起让自己下次看到还能知道自己的变量指的是什么,而且没有人能够一开始就写对循环,报错之后从容不迫的修改就好了。
PI大人是我见过最聪明的人之一,并且是那群最聪明的人中性格最好的,我从来没有见他不耐烦过,或者沉不住气过,永远乐观,永远supportive。我刚来的时候问他,Gary,你对我的期待是什么?Gary说,我希望你在这过的开心,然后能做你想做的事情。然后,他确实创造了这样的环境,让每个人都在做自己想做的事。(省略我对PI大人和我们实验室的赞美一万字)
解决了这个问题,我们来练习loop吧。
问题:求1~99内所有整数中,3和5的倍数的和。

total4 = 0
for i in range(1,100):
    if i % 3 == 0 or i % 5 == 0:
        total4 += i
print(total4)

https://www.youtube.com/channel/UCxX9wt5FWQUAAz4UrysqK9A
顺便推荐一个适合初学者(如我)的教程,CS Dojo 的youtube channel,声音很好听,讲的也非常精炼,我实在是受不了很多教育机构的视频,废话太多。。。

上一篇 下一篇

猜你喜欢

热点阅读