2017-03-08 37 views
2

即使列標籤不存在,在某些情況下訪問熊貓數據框也不會引發異常。在Pandas中訪問錯誤的列標籤時不會引發異常?

我應該如何檢查這些情況,以避免讀取錯誤的結果?

a = pd.DataFrame(np.zeros((5,2)), columns=['la', 'lb']) 

a 
Out[349]: 
    la lb 
0 0.0 0.0 
1 0.0 0.0 
2 0.0 0.0 
3 0.0 0.0 
4 0.0 0.0 

a.loc[:, 'lc'] # Raised exception as expected. 

a.loc[:, ['la', 'lb', 'lc']] # Not expected. 
Out[353]: 
    la lb lc 
0 0.0 0.0 NaN 
1 0.0 0.0 NaN 
2 0.0 0.0 NaN 
3 0.0 0.0 NaN 
4 0.0 0.0 NaN 

a.loc[:, ['la', 'wrong_lb', 'lc']] # Not expected. 
Out[354]: 
    la wrong_lb lc 
0 0.0  NaN NaN 
1 0.0  NaN NaN 
2 0.0  NaN NaN 
3 0.0  NaN NaN 
4 0.0  NaN NaN 

更新:有一個建議重複的問題(Safe label-based selection in DataFrame),但它是關於行選擇,我的問題是關於列選擇。

+0

的可能的複製[在數據幀安全基於標籤的選擇] (http://stackoverflow.com/questions/40204834/safe-label-based-selection-in-dataframe) –

+0

我沒有看到這個問題,但它是關於行選擇,我的問題是關於列選擇。 – THN

+0

這是關於使用'loc'的基於標籤的選擇,原理完全一樣。 –

回答

4

它看起來像是因爲至少有一列存在,它會返回一個放大的df作爲reindex操作。

您可以定義一個用戶func來驗證將處理列是否存在的列。在這裏,我在迭代所傳遞的構造大熊貓指數對象,並調用intersection從現有的DF返回的共同價值觀和迭代通過:

In [80]: 
def val_cols(cols): 
    return pd.Index(cols).intersection(a.columns) 
​ 
a.loc[:, val_cols(['la', 'lb', 'lc'])] 

Out[80]: 
    la lb 
0 0.0 0.0 
1 0.0 0.0 
2 0.0 0.0 
3 0.0 0.0 
4 0.0 0.0 

這也處理完全丟失列:

In [81]: 
a.loc[:, val_cols(['x', 'y'])] 

Out[81]: 
Empty DataFrame 
Columns: [] 
Index: [0, 1, 2, 3, 4] 

這也處理您的後一種情況:

In [83]: 
a.loc[:, val_cols(['la', 'wrong_lb', 'lc'])] 

Out[83]: 
    la 
0 0.0 
1 0.0 
2 0.0 
3 0.0 
4 0.0 

更新

的情況下,你想只測試是否都是有效的,你可以只遍歷列表中的每個列並追加達夫列:

In [93]: 
def val_cols(cols): 
    duff=[] 
    for col in cols: 
     try: 
      a[col] 
     except KeyError: 
      duff.append(col) 
    return duff 
invalid = val_cols(['la','x', 'y']) 
print(invalid) 

['x', 'y'] 
+0

謝謝。如果我想知道列名不存在時該怎麼辦?例如,'wrong_lb'是一個錯字,我想趕上並解決這個問題? – THN

+0

你可以遍歷每一列,然後捕獲'KeyError'異常,請參閱更新回答 – EdChum

+0

謝謝,所以我會嘗試在輔助方法val_cols()中做一些事情。 – THN

相關問題