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