Python 基于列中的值筛选dataframe中的行

Python 基于列中的值筛选dataframe中的行,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,我有以下数据帧: In [48]: df.head(10) Out[48]: beat1 beat2 beat3 beat4 beat5 beat6 beat7 filename M46_MI_RhHy61d.dat 0.7951 0.8554 0.9161 1.0789

我有以下数据帧:

In [48]: df.head(10)
Out[48]: 
                      beat1   beat2   beat3   beat4   beat5   beat6   beat7  
filename                                                                      
M46_MI_RhHy61d.dat   0.7951  0.8554  0.9161  1.0789  0.6664  0.7839  0.6076   
M60_MI_AH53d.dat     0.7818  0.7380  0.8657  0.9980  0.7491  0.9272  0.8781   
M57_Car_AF0489d.dat  1.1040  1.1670  1.7740  1.3080  1.2190  1.0800  1.2390   
F62_MI_AH39d.dat     1.2150  0.9360  0.9890  1.1960  0.8420  1.1530  1.1360   
F81_MI_DM10d.dat     1.0650  1.1190  1.1330  1.2040  1.1220  1.1640  1.0600   
M61_My_508d.dat      0.6963  0.7910  0.6362  0.6938  0.7410  0.7198  0.7060   
M69_MI_554d.dat      1.0400  1.0890  1.0190  0.9600  1.0720  1.0870  1.0100   
F78_MI_548d.dat      1.1410  1.3290  0.8620  0.0000  1.3160  1.2180  1.2870   
F68_MI_AH152d.dat    1.1910  1.1170  1.1030  1.2430  1.0100  0.0000  0.0000   
M46_Myo_484d.dat     0.6799  0.7278  0.6808  0.7059  0.7973  0.6956  0.6685 
在某些情况下,列中的某些(但不一定全部)值等于
0
,我不知道它们会出现在给定行的哪些列中。例如,在上面给出的数据帧中,最后第二行中的最后两个值为零。我想从数据帧中删除这样的行。如果我知道这些值将出现在哪些列中,我就可以这样做,然而,这正是我所不知道的。有什么想法吗?

IIUC:

要删除任何一行中的零吗

选项1
pd.DataFrame.mask
返回带有
np.nan
的数据帧,其中布尔数组参数为
True
。然后我可以
dropna
,它默认为在存在任何空值的地方删除行

df.mask(df == 0).dropna()

                      beat1   beat2   beat3   beat4   beat5   beat6   beat7
filename                                                                   
M46_MI_RhHy61d.dat   0.7951  0.8554  0.9161  1.0789  0.6664  0.7839  0.6076
M60_MI_AH53d.dat     0.7818  0.7380  0.8657  0.9980  0.7491  0.9272  0.8781
M57_Car_AF0489d.dat  1.1040  1.1670  1.7740  1.3080  1.2190  1.0800  1.2390
F62_MI_AH39d.dat     1.2150  0.9360  0.9890  1.1960  0.8420  1.1530  1.1360
F81_MI_DM10d.dat     1.0650  1.1190  1.1330  1.2040  1.1220  1.1640  1.0600
M61_My_508d.dat      0.6963  0.7910  0.6362  0.6938  0.7410  0.7198  0.7060
M69_MI_554d.dat      1.0400  1.0890  1.0190  0.9600  1.0720  1.0870  1.0100
M46_Myo_484d.dat     0.6799  0.7278  0.6808  0.7059  0.7973  0.6956  0.6685
选项2
使用
loc
,其中行中的所有值均

df.loc[(df != 0).all(1)]
选项3
numpy
提供了很多效率。与备选方案2类似的概念。然而,我们从头开始重建

v = df.values
mask = (v != 0).all(1)
pd.DataFrame(v[mask], df.index[mask], df.columns)

原始时间测试


成功了!请你也解释一下好吗?特别是,我想知道为什么
df=df[df>0]
不起作用。@泰和井
df[df>0]
有点起作用。它返回
df
的部分,其中
df>0
True
。对于
df>0
False
的位置,它没有答案,因此得到的是空值
df[df>0].dropna()
也可以。