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

里面的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,声音很好听,讲的也非常精炼,我实在是受不了很多教育机构的视频,废话太多。。。
网友评论