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

Extract specific rows based on the set cut-off values in columns

我有一个 TAB 分隔的 .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

我想提取至少有 3 列的值 > 0.. 如何使用 pandas 执行此操作?我对如何在 .txt 文件中使用条件一无所知。

非常感谢!


更新:添加到这个问题上,我如何分析这个条件的特定列。假设我查看 A、C、E 和 F 列,然后提取至少有 3 个这些列的行值 >5.

干杯!

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

使用运算符(作为对 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

类似地,查询具有 5 个或更多正值的所有行:

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

小猪放弃@MaxU 解决方案,我喜欢继续将 'gene_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