2017-03-01 92 views
2

從stats.scipy中,我已將變化測試的係數應用於數據框中的每個數字列,並且要篩選輸出以便它只顯示具有大於0的值的列,那不是失蹤。這裏是我的代碼:使用for循環操作python函數輸出

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

我認爲你需要notnull爲檢查NaN,然後檢查0昂返回所有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 

編輯:

如果xSeries使用:

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 
+0

在函數輸出中嘗試了您的代碼,並且收到錯誤消息:索引器太多 – kynnem

+0

什麼是x.info()? – jezrael

+0

x.info()返回錯誤。類型(x)是一個pandas.core.series.Series – kynnem