使用for循环操作python函数输出

时间:2017-03-01 14:32:58

标签: python pandas for-loop scipy

从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不会显示

1 个答案:

答案 0 :(得分:1)

我认为您需要notnull来检查NaN,然后检查0 ang返回所有Trueall的位置。上次使用locboolean 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