我的数据框与下表类似,有6列,如果使用了特定的抗生素,每列都有“是”或“否”。
| 方位|临床|CFTX|地铁|CFTN|多西|治疗|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 是的|是的|没有|没有|没有|没有||
| 没有|是的|没有|是的|没有|没有||
| 是的|是的|没有|没有|没有|没有||
| 没有|没有|没有|没有|没有|没有||
| 是的|是的|是的|是的|是的|是的||
| 没有|是的|是的|是的|没有|是的||
| 没有|没有|没有|没有|没有|是的||
| 没有|没有|没有|没有|没有|没有||
| 是的|是的|是的|没有|没有|没有||
| 是的|没有|是的|是的|没有|没有||
| 是的|没有|没有|没有|是的|没有||
| 没有|没有|是的|是的|没有|是的||
| 没有|没有|没有|没有|是的|是的||
| 没有|没有|没有|是的|没有|是的||
如果抗生素列的特定组合包含“是”,我想用“真”填充列“已治疗”。如果不满足条件,我想用“假”值填充“已治疗”列。
如果['方位'] &['临床'] == '是'|
[“方位”] &[“CFTX”] &[“临床”] ==“是”|
[“方位”] &[“CFTX”] &[“地铁”]==“是”|
['方位'] &['CFTN'] == '是'|
['CFTX'] &['DOXY'] &['METRO']== '是'|
['CFTN'] &['DOXY'] == '是'|
['DOXY'] &['METRO']== '是',
然后在列“TREATED”中返回“True”
否则为“假”
我脑子里想的是某种if语句或lambda函数的使用,然而,我遇到了麻烦。
这不能仅限于上述组合,还应包括所有6种药物给药的情况。如果是这种情况,则应返回“True”,因为已满足至少给予2种治疗药物的条件。
所需输出如下:
| 方位|临床|CFTX|地铁|CFTN|多西|治疗|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 是的|是的|没有|没有|没有|没有|是的|
| 没有|是的|没有|是的|没有|没有|没有|
| 是的|是的|没有|没有|没有|没有|是的|
| 没有|没有|没有|没有|没有|没有|没有|
| 是的|是的|是的|是的|是的|是的|是的|
| 没有|是的|是的|是的|没有|是的|是的|
| 没有|没有|没有|没有|没有|是的|没有|
| 没有|没有|没有|没有|没有|没有|没有|
| 是的|是的|是的|没有|没有|没有|是的|
| 是的|没有|是的|是的|没有|没有|是的|
| 是的|没有|没有|没有|是的|没有|是的|
| 没有|没有|是的|是的|没有|是的|是的|
| 没有|没有|没有|没有|是的|是的|是的|
| 没有|没有|没有|是的|没有|是的|是的|
4条答案
按热度按时间kiayqfof1#
使用您提供的 Dataframe :
下面是一种方法:
然后:
ny6fqffe2#
这有点抽象,但您可以使用位标志来表示每个Yes(True),并为其分配一个二进制值,然后基于if语句进行威胁运算。
https://dietertack.medium.com/using-bit-flags-in-c-d39ec6e30f08
yvfmudvl3#
您可以使用集合运算,首先聚合为给定药物的集合,然后检查所有可能的组合(如果有超集):
输出:
ubby3x7f4#
我的答案是试图将这个解向量化。但是我从Mozway那里得到了超集的想法。在此之前,我不知道如何处理所有的组合
代码的一般解释是,我创建了一个numpy数组,其中包含所有组合,包括可接受的组合(两个或更多组合的总和)。
任何不属于组合的额外药物都将通过在组合列表中将值设置为-1来进行惩罚。(如果不惩罚额外药物,则不需要超集,您只需与原始组合变量的总和进行比较。)
然后,在数据集和所有组合的集合之间进行点积,并将值与组合的总和进行比较(在用-1替换0之前)。这意味着如果值为3,组合的预期结果为3,则它是有效的组合。以下是组合的总和(作为数组
一个三个三个一个
在点积之后,我们用1替换有效值,用0替换无效值(小于预期和)。我们对所有组合求和,看看是否有有效的组合。如果组合之和〉= 1,则至少有一个组合是有效的。否则,所有组合都是无效的。
将最终求和列替换为True或False,并应用于原始 Dataframe 。