2017-04-04 50 views
3

考慮下面的代碼:爲什麼一列停留在數據幀的指數即使它被丟棄

>>> data = pandas.DataFrame({ 'user': [1, 5, 3, 10], 'week': [1, 1, 3, 4], 'value1': [5, 4, 3, 2], 'value2': [1, 1, 1, 2] }) 
>>> data = data.pivot_table(index='user', columns='week', fill_value=0) 
>>> data['target'] = [True, True, False, True] 
>>> data 
    value1  value2  target 
week  1 3 4  1 3 4 
user 
1   5 0 0  1 0 0 True 
3   0 3 0  0 1 0 True 
5   4 0 0  1 0 0 False 
10  0 0 2  0 0 2 True 

現在,如果我把這叫做:

>>> 'target' in data.columns 
True 

它返回True預期。但是,爲什麼這也會返回True

>>> 'target' in data.drop('target', axis=1).columns 
True 

我怎樣才能從表刪除列所以它不再索引和上面的語句返回False

回答

3

從現在開始(pandas 0.19.2),multiindex將保留其結構中所有使用過的標籤。刪除列不會從多重索引中刪除它的標籤,並且它仍然在其中引用。參見長GH項目here

因此,您必須解決問題並進行假設。如果你確信你正在檢查的標籤是在一個特定的指數水平(在你的例子0級),再一個辦法是做這樣的:

'target' in data.drop('target', axis=1).columns.get_level_values(0) 
Out[145]: False 

如果它可以是任何級別,就可以使用get_values()和查找整個列表:

import itertools as it 
list(it.chain.from_iterable(data.drop('target', axis=1).columns.get_values())) 
Out[150]: ['value1', 1, 'value1', 3, 'value1', 4, 'value2', 1, 'value2', 3, 'value2', 4] 
+1

注意在0.20.0(約1個月),這將是在合併:https://github.com/pandas-dev/pandas/pull/15694,這將允許''data.columns = data.columns.remove_unused_levels()''來解決這個問題(它不是自動的,但可以緩解的東西) – Jeff

相關問題