我认为您需要notnull 来检查NaN,然后检查0 并返回所有True 通过all。最后使用loc 和boolean indexing:
mask = (df.notnull() & (df != 0)).all()
print (df.loc[:, mask])
示例:
x = pd.DataFrame({'A':[1,0,0],
'B':[4,np.nan,6],
'C':[7,8,9]})
print (x)
A B C
0 1 4.0 7
1 0 NaN 8
2 0 6.0 9
print (x.notnull() & (x != 0))
A B C
0 True True True
1 False False True
2 False True True
print ((x.notnull() & (x != 0)).all())
A False
B False
C True
dtype: bool
mask = (x.notnull() & (x != 0)).all()
print (x.loc[:, mask])
C
0 7
1 8
2 9
编辑:
如果x 是Series,则使用:
x = pd.Series([np.nan, 1, 0, 0, 5, np.nan])
print (x)
0 NaN
1 1.0
2 0.0
3 0.0
4 5.0
5 NaN
dtype: float64
print (x[x.notnull() & (x != 0)])
1 1.0
4 5.0
dtype: float64
编辑1:
x = pd.Series([np.nan, 3.809518, 7.031835000000001, 20.190089999999998, 21.217053, 20.806],
index=['var_1', 'var_2', 'var_5', 'var_10', 'var_20', 'var_30'])
print (x)
var_1 NaN
var_2 3.809518
var_5 7.031835
var_10 20.190090
var_20 21.217053
var_30 20.806000
dtype: float64
print (x.notnull() & (x != 0))
var_1 False
var_2 True
var_5 True
var_10 True
var_20 True
var_30 True
dtype: bool
print (x[x.notnull() & (x != 0)])
var_2 3.809518
var_5 7.031835
var_10 20.190090
var_20 21.217053
var_30 20.806000
Name: 1, dtype: float64