python - 根据数据框中的位置计算元素

标签 python pandas python-2.7

下面,我有一个表格,其中列 TST1TST5不能采用任何值或以下值之一:NOT_DONE INCOMP UNTESTED 30 35 40 45 50我需要计算从下表中验证的元素(行)的数量。
一个元素被认为是 已验证 当最右边的值是 30 到 50 之间的一个时(用 5 分隔,所以 30、35、40...)。这意味着如果该行对所有 TST1 都没有值至 TST5那么什么都不算。如果在 NOT_DONE 的左侧找到数值INCOMPUNTESTED那么它没有被验证。
换句话说,我需要从右到左计算每一行。
例如,从下表中,只有 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 2.7.18 和 pandas 0.24.2 上测试过(尽管它在 python 3 中工作正常):

  • 使用 ffill 提取最右边的值和 to_numeric 将它们强制转换为数字:
    rightmost = df.filter(like='TST').ffill(axis='columns').iloc[:, -1]
    rightmost = pd.to_numeric(rightmost, errors='coerce')
    
    # 0      NaN
    # 1     35.0
    # 2      NaN
    # 3      NaN
    # 4      NaN
    # 5      NaN
    # 6     30.0
    # 7     40.0
    # 8      NaN
    # 9      NaN
    # 10     NaN
    # 11     NaN
    # 12    50.0
    # 13     NaN
    # 14     NaN
    # 15     NaN
    # 16    30.0
    # 17     NaN
    # 18     NaN
    # Name: TST5, dtype: float64
    
  • 然后 groupby Group并检查它们是否是 between 30和50(含):
    valid = rightmost.groupby(df.Group).apply(
        lambda g: g.between(30, 50, inclusive='both').sum()
    ).to_frame('Valid')
    
    #        Valid
    # Group       
    # A          3
    # B          2
    
  • 关于python - 根据数据框中的位置计算元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69036955/

    相关文章:

    python - 你如何将 bz2 分配给 python 的 altinstall?

    python - Pandas数据透视表,如何在values属性中放置一系列列

    python - 在 pandas 中执行条件 groupby 计数后显示列的零值

    python-2.7 - Google AppEngine 上的 HTML 到 PDF

    python - 仅按日期比较日期时间对象

    Python - 替换 exec 来动态创建变量

    python - 在 Pygame 中只填充一半的显示?

    python - 为什么导入 python 模块不导入嵌套模块?

    python - 基于正则表达式创建两个数据框

    python - 在 mongo (python) 中添加列表字段