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

时间:2017-09-20 19:06:21

标签: python pandas dataframe extract

我有一个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 .. 我如何使用熊猫这样做?我对如何在.txt文件中使用条件一无所知。

非常感谢!

更新:添加到这个问题,我如何分析这个条件的特定列...让我们看看列A,C,E& F然后提取具有值> 5的这些列中至少3列的行。

喝彩!

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

小猪退出@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