根据列中的值过滤pandas数据帧中的行

时间:2017-03-28 09:41:06

标签: 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  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,并且我不知道它们在给定行中会出现哪些列。例如,在上面给出的数据帧中,倒数第二行中的最后两个值为零。我想从数据框中删除这些行。如果我知道这些值出现的列,我就可以做到,但是,这正是我不知道的。关于这样做的任何想法?

1 个答案:

答案 0 :(得分:3)

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)

天真时间测试

enter image description here