【发布时间】:2021-11-01 07:47:58
【问题描述】:
在下面,我有一个表,其中 TST1 到 TST5 的列不能采用任何值或以下之一:NOT_DONEINCOMPUNTESTED30354045@ 987654330@
我需要计算从下表中验证的元素(行)的数量。
当最右边的值介于 30 和 50 之间(由 5 分隔,因此 30、35、40...)时,元素被认为是已验证。这意味着如果该行对于所有TST1 到TST5 都没有值,则不计算任何内容。如果在 NOT_DONE INCOMP 或 UNTESTED 的左侧找到数值,则不会对其进行验证。
换句话说,我需要从右到左计算每一行。
例如,从下表中,只有 6 个元素被认为是经过验证的。
最后,我需要计算其中有多少属于 A 组或 B 组。
我最初解决这个问题的想法是创建一个包含所有经过验证的元素的新列,但我真的不知道该怎么做。
我正在使用 python 2.7 和 pandas 0.24.2。我是新手,非常感谢任何帮助或指导。
+-------+----------+----------+----------+--------+----------+
| Group | TST1 | TST2 | TST3 | TST4 | TST5 |
+-------+----------+----------+----------+--------+----------+
| A | | NOT_DONE | | | 50 |
+-------+----------+----------+----------+--------+----------+
| A | | | 35 | | |
+-------+----------+----------+----------+--------+----------+
| B | | | | | |
+-------+----------+----------+----------+--------+----------+
| A | | | INCOMP | | |
+-------+----------+----------+----------+--------+----------+
| B | UNTESTED | | 50 | INCOMP | |
+-------+----------+----------+----------+--------+----------+
| B | | | | | |
+-------+----------+----------+----------+--------+----------+
| B | | 30 | | | |
+-------+----------+----------+----------+--------+----------+
| A | | INCOMP | 40 | | |
+-------+----------+----------+----------+--------+----------+
| B | | | | | UNTESTED |
+-------+----------+----------+----------+--------+----------+
| A | | | | | |
+-------+----------+----------+----------+--------+----------+
| B | | INCOMP | | | |
+-------+----------+----------+----------+--------+----------+
| A | | | | | |
+-------+----------+----------+----------+--------+----------+
| B | | 50 | | | |
+-------+----------+----------+----------+--------+----------+
| B | | | UNTESTED | 35 | NOT_DONE |
+-------+----------+----------+----------+--------+----------+
| B | | | | | |
+-------+----------+----------+----------+--------+----------+
| A | | 40 | | INCOMP | |
+-------+----------+----------+----------+--------+----------+
| A | | | | 30 | |
+-------+----------+----------+----------+--------+----------+
| B | | | | | |
+-------+----------+----------+----------+--------+----------+
| B | | NOT_DONE | | 30 | NOT_DONE |
+-------+----------+----------+----------+--------+----------+
编辑: 这是我尝试过的,但它计算所有显示数值的行,而不是最右边的值为数字的行。我真的不知道如何选择从右边开始。
filter1 = df.loc[:, 'TST1':'TST5']\
.apply(lambda x: x.astype(str).str.match(r'\d+\.*\d*'), axis=0)\
.any(axis=1)
number_validated = filter1.sum()
print "Number of validated items: ", number_validated
预期的输出应该只是一个简短的文本摘要:
Number of validated items: 5
Number of group A validated items: 4
Number of group B validated items: 2
【问题讨论】:
标签: python pandas python-2.7