从stats.scipy,我已经将变异测试系数应用到我的数据框中的每个数字列,我想要筛选输出,以便它只显示值大于0且不是'缺少。这是我的代码:
x = df.select_dtypes(exclude=['object']).apply(stats.variation)*100
for i in x:
if i != 'NaN' and i != 0:
print i
它仍然返回NaN,值为0.我该如何解决这个问题?另外,我如何格式化它以便循环返回变量的名称以及数值?
编辑: 这是我存储在x:
中的函数的输出 var_1 NaN
var_2 3.809518
var_5 7.031835
var_10 20.190090
var_20 21.217053
var_30 20.806000
我想格式化输出,以便var_1不会显示
答案 0 :(得分:1)
我认为您需要notnull
来检查NaN
,然后检查0
ang返回所有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
EDIT1:
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