我有一个熊猫的数据框架,上面有一个有机体名称和抗生素敏感性的列表。我希望根据以下规则将所有有机体合并到下面的数据框中的一列中。在
如果ORG1==A,则不执行任何操作;
如果ORG1!=A和ORG2==A,将ORG2值移到ORG1列中
如果ORG1!=A和ORG3==A,将ORG3值移到ORG1列中
如果满足条件2,同时将ORG2值移动到ORG1列,也将AS20*中的列值移动到AS10*。在
类似地,如果满足条件3,并将ORG3值移动到ORG1列,也将AS30*中的列值移动到AS10*。在
我自己根据上面的规则编写了一个函数,并根据以下几点取得了有限的成功:
If ORG2 == A:
return ORG1.map(ORG2)
当我试图根据情况依次映射AS201->;AS101、AS202->;AS102、AS203->;AS103等时,我迷路了。在
另一个问题是,生物体的名字不是单字母,漂亮的也不是。示例中的A相当于我的数据集中的re.match('aureus')
。在
另外,每一个ORG列有20个AS列,超过150000个记录,所以我希望它可以推广到任何数量的抗生素敏感性结果。在
我有点挣扎,所以往正确的方向推几下真的很有帮助。在
提前谢谢。在
^{pr2}$
我们可以选择}的行
ORG1 != A
和{
^{pr2}$mask
就是一个布尔序列。要将值从ORG2复制到ORG1,我们可以使用或者,既然我们知道右边的值是
A
,我们可以使用复制AS列的操作类似。在
我们可以找到其列值包含诸如
'aureus'
的字符串的行str.contains
可以将任何regex模式作为其参数。 请参阅文档:Vectorized String Methods。在注意:通常使用
df[orgi].str.contains('aureus')
(没有== True
),但是由于df[orgi]
可能包含NaN
值,我们还需要将NaN
映射为False,因此我们使用df[orgi].str.contains('aureus') == True
。在收益率
请注意,如果}中的值都会竞争覆盖
ORG2 == A
和ORG3 == A
,则列AS20*
和{AS10*
列中的值。我不知道你想赢哪个值。在上面的代码中,最后一个列获胜,这将是AS30*
。在相关问题 更多 >
编程相关推荐