2016-12-26 28 views
1

私の目的は、ブールマスクを使用してDataFrameから有用なカラムを取得することです。Pandas DataFrameカラムのブールマスク

私はコードのように抜粋してみてください:

df = pd.DataFrame({'a': [1,2,3,4,5], 'b': [101, 101, 102, 101, 102], 'c': [23, 12, 54, 65, 21]}) 
mask = [True, False, True] 
df.columns[mask] 

をし、結果は私が実際に必要なものです:

Index([u'a', u'c'], dtype='object') 

その後、私は同じコードを試してみたが、別のマスクで:

mask_i = [1, 0, 1] 

df = pd.DataFrame({'a': [1,2,3,4,5], 'b': [101, 101, 102, 101, 102], 'c': [23, 12, 54, 65, 21]}) 
mask_i = [1, 0, 1] 
df.columns[mask] 

私は同じ結果を期待しましたが、すべてのインデックスを取得しました:

Index([u'b', u'a', u'b'], dtype='object') 

それから私は、チェック:マスクが同じであるが、私は異なる結果を得る理由

mask_i = [1, 0, 1] 
mask = [True, False, True] 
print mask == mask_i` 

# Result: `True` 

誰かがしてください説明することができます。

+2

チェックこの質問と答えaccepeted:http://stackoverflow.com/questions/2764017/is-false-0-and-ブールにあなたの整数のインデックスを変換するには

、あなたはどちらかを使用することができますtrue-1-in-python-implementation-detail-or-it-guarantee – grubjesic

+2

__boolean__ indexing!=整数インデックス作成。 'df.columns [[1、0、1]]'は以下の__indexes__を持つ列のリストを返します: '[1,0,1]' – MaxU

答えて

6

これは、Pandasがbooleanスライスをマスクとして扱いますが、ルックアップとして整数スライスを使用するためです。あなたの例では、columns[[1, 0, 1]]が2番目の2番目の列、次に1番目の列、次に2番目の列を参照することがわかります。["b", "a", "b"]

>>> np.array([1, 0, 1]).astype(bool) 
array([ True, False, True], dtype=bool) 
>>> map(bool, [1, 0, 1]) 
[True, False, True]