Python 按行和和和值筛选

Python 按行和和和值筛选,python,pandas,row,filtering,Python,Pandas,Row,Filtering,我正在尝试筛选数据框中的行。我必须过滤掉所有总和为0的行,以及所有行,它们的值中有5%或更多等于0 DataFrame是50000个行x120个列。我设法筛选出所有行,总和为0的行,但没有筛选出5%或更多值等于0的行 import pandas as pd df = pd.read_csv("file. a = df[df.sum(axis=1) > 0] gene1 0.000000 0.000000 4108.683105 41.675945

我正在尝试筛选数据框中的行。我必须过滤掉所有总和为0的
,以及所有
,它们的值中有5%或更多等于0

DataFrame
是50000个
x120个
。我设法
筛选出所有
总和
为0的行,但没有筛选出5%或更多值等于0的行

import pandas as pd

df = pd.read_csv("file.
a = df[df.sum(axis=1) > 0] 

gene1   0.000000     0.000000    4108.683105      41.675945        0.000000
gene2   2650.009521  3437.226807  20.767439         0.000000      902.217712 

您可以使用
.mask()
过滤掉非零值:

然后,如果
.count(axis=1)
,则可以获得每行
的非零值计数,并且可以通过将结果与
计数
进行比较,从中获得
布尔索引

使用以下示例数据:

df = pd.DataFrame(np.random.randint(low=0, high=10, size=(100, 50)))
df_colcount = float(len(df.columns))
df['zero_count'] = df.mask(df!=0).count(axis=1)
df['zero_share'] = df.mask(df!=0).count(axis=1).div(df_colcount)
从这里可以筛选所需的行:

df[df.zero_share < 0.05]

    0  1  2  3  4  5  6  7  8  9     ...      42  43  44  45  46  47  48  49  \
0   4  0  3  1  6  4  5  8  8  9     ...       4   7   9   4   5   9   4   5   
8   7  1  2  1  5  2  4  4  5  7     ...       5   6   3   3   3   4   9   4   
19  6  6  2  9  2  4  9  8  6  1     ...       2   6   5   9   4   9   7   5   
23  7  8  4  1  4  5  6  5  5  5     ...       3   8   9   8   5   5   5   3   
53  3  7  9  5  0  2  3  3  3  1     ...       5   4   7   1   2   7   7   1   
70  7  9  6  4  4  8  6  3  1  3     ...       1   1   1   9   1   3   1   5   
77  4  4  2  4  2  9  8  2  6  8     ...       8   8   7   8   2   3   5   9   
85  5  7  0  4  6  2  6  5  7  8     ...       9   8   6   6   2   4   5   5   
98  9  9  6  6  4  7  9  1  6  4     ...       4   6   1   2   4   1   8   1   

    zero_count  zero_share  
0            2        0.04  
8            1        0.02  
19           2        0.04  
23           2        0.04  
53           2        0.04  
70           1        0.02  
77           2        0.04  
85           2        0.04  
98           1        0.02 
df[df.zero\u share<0.05]
0  1  2  3  4  5  6  7  8  9     ...      42  43  44  45  46  47  48  49  \
0   4  0  3  1  6  4  5  8  8  9     ...       4   7   9   4   5   9   4   5   
8   7  1  2  1  5  2  4  4  5  7     ...       5   6   3   3   3   4   9   4   
19  6  6  2  9  2  4  9  8  6  1     ...       2   6   5   9   4   9   7   5   
23  7  8  4  1  4  5  6  5  5  5     ...       3   8   9   8   5   5   5   3   
53  3  7  9  5  0  2  3  3  3  1     ...       5   4   7   1   2   7   7   1   
70  7  9  6  4  4  8  6  3  1  3     ...       1   1   1   9   1   3   1   5   
77  4  4  2  4  2  9  8  2  6  8     ...       8   8   7   8   2   3   5   9   
85  5  7  0  4  6  2  6  5  7  8     ...       9   8   6   6   2   4   5   5   
98  9  9  6  6  4  7  9  1  6  4     ...       4   6   1   2   4   1   8   1   
零计数零份额
0            2        0.04  
8            1        0.02  
19           2        0.04  
23           2        0.04  
53           2        0.04  
70           1        0.02  
77           2        0.04  
85           2        0.04  
98           1        0.02 
当然,您可以在一个步骤中完成这一切:

df[df.mask(df!=0).count(axis=1).div(float(len(df.columns))) < 0.05]
df[df.mask(df!=0).count(axis=1).div(float(len(df.columns)))<0.05]

或者,您确实可以应用掩码来识别具有非零值的
。这些是获得相同结果的等效方法。

不知道.mask()。谢谢你的帮助,效果很好。事实上,我又看了一遍数据,结果没有用。我仍然有超过0值5%的行。我对它做了一点修改df[df.mask(df==0).count(axis=1).div(float(len(df.columns))).mul(100)>95],它似乎工作了。上面的编写方式是,它将行保持在5%以上。如果要除去这些并保留小于5%的,请在
masked.count()…
表达式中使用
<0.05
df[df.mask(df!=0).count(axis=1).div(float(len(df.columns))) < 0.05]