代码之家  ›  专栏  ›  技术社区  ›  PSD

根据列中设置的截止值提取特定行

  •  2
  • PSD  · 技术社区  · 7 年前

    我有一个制表符分隔。看起来像这样的txt文件。

    Gene_name   A   B   C   D   E   F
    Gene1      1    0   5   2   0   0
    Gene2      4    45  0   0   32  1
    Gene3      0    23  0   4   0   54
    Gene4     12    0   6   8   7   4
    Gene5     4     0   0   6   0   7
    Gene6     0     6   8   0   0   5
    Gene7     13    45  64  234 0   6
    Gene8     11    6   0   7   7   9
    Gene9      6    0   12  34  0   11
    Gene10    23    4   6   7   89  0
    

    非常感谢!


    更新:在这个问题的基础上,我如何分析这种情况下的特定列。。假设我查看A、C、E和;F,然后提取至少有3列的行,这些列的值为gt;5.

    3 回复  |  直到 7 年前
        1
  •  2
  •   MaxU - stand with Ukraine    7 年前
    df = pd.read_csv(filename, delim_whitespace=True)
    
    In [22]: df[df.select_dtypes(['number']).gt(0).sum(axis=1).ge(3)]
    Out[22]:
      Gene_name   A   B   C    D   E   F
    0     Gene1   1   0   5    2   0   0
    1     Gene2   4  45   0    0  32   1
    2     Gene3   0  23   0    4   0  54
    3     Gene4  12   0   6    8   7   4
    4     Gene5   4   0   0    6   0   7
    5     Gene6   0   6   8    0   0   5
    6     Gene7  13  45  64  234   0   6
    7     Gene8  11   6   0    7   7   9
    8     Gene9   6   0  12   34   0  11
    9    Gene10  23   4   6    7  89   0
    

    一些解释:

    In [25]: df.select_dtypes(['number']).gt(0)
    Out[25]:
           A      B      C      D      E      F
    0   True  False   True   True  False  False
    1   True   True  False  False   True   True
    2  False   True  False   True  False   True
    3   True  False   True   True   True   True
    4   True  False  False   True  False   True
    5  False   True   True  False  False   True
    6   True   True   True   True  False   True
    7   True   True  False   True   True   True
    8   True  False   True   True  False   True
    9   True   True   True   True   True  False
    
    In [26]: df.select_dtypes(['number']).gt(0).sum(axis=1)
    Out[26]:
    0    3
    1    4
    2    3
    3    5
    4    3
    5    3
    6    5
    7    5
    8    4
    9    5
    dtype: int64
    
        2
  •  2
  •   cs95 abhishek58g    7 年前

    使用运算符(作为Max答案的补充):

    mask = (df.iloc[:, 1:] > 0).sum(1) >= 3    
    mask
    
    0    True
    1    True
    2    True
    3    True
    4    True
    5    True
    6    True
    7    True
    8    True
    9    True
    dtype: bool
    
    df[mask] 
      Gene_name   A   B   C    D   E   F
    0     Gene1   1   0   5    2   0   0
    1     Gene2   4  45   0    0  32   1
    2     Gene3   0  23   0    4   0  54
    3     Gene4  12   0   6    8   7   4
    4     Gene5   4   0   0    6   0   7
    5     Gene6   0   6   8    0   0   5
    6     Gene7  13  45  64  234   0   6
    7     Gene8  11   6   0    7   7   9
    8     Gene9   6   0  12   34   0  11
    9    Gene10  23   4   6    7  89   0
    

    df[(df.iloc[:, 1:] > 0).sum(1) >= 5]
    
      Gene_name   A   B   C    D   E  F
    3     Gene4  12   0   6    8   7  4
    6     Gene7  13  45  64  234   0  6
    7     Gene8  11   6   0    7   7  9
    9    Gene10  23   4   6    7  89  0
    
        3
  •  1
  •   Scott Boston    7 年前

    Piggy放弃了@MaxU解决方案,我喜欢继续将“gene\u name”放入索引,不用担心所有索引切片:

    df = pd.read_csv(tfile, delim_whitespace=True, index_col=0)
    df[df.gt(0).sum(1).ge(3)]
    

    编辑以更新问题:

    df[df[['A','C','E','F']].gt(5).sum(1).ge(3)]
    

                A   B   C    D   E   F
    Gene_name                         
    Gene4      12   0   6    8   7   4
    Gene7      13  45  64  234   0   6
    Gene8      11   6   0    7   7   9
    Gene9       6   0  12   34   0  11
    Gene10     23   4   6    7  89   0
    
    推荐文章