2016-06-21 12 views
4

リストの列名を渡すと複数の列を選択できます。私はタプルの列名を渡すことができないことに驚きました。タプルを渡すと、パンダにキーエラーが発生するのはなぜですか?

import pandas as pd 

df = pd.DataFrame([[2,3,4],[3,4,5]],columns=['a','b','c']) 

print df[['a','b']] 
print df[('a','b')] # Key error 

これはなぜですか?私が行方不明の重要なことはありますか?私が知る限り、唯一の違いは、第2の場合、マルチキーは不変であるということです。

答えて

4

あなたはとてもその後、tupleを選択するために使用し、tupleとして列名を持つことができます。

import pandas as pd 

df = pd.DataFrame([[2,3,4],[3,4,5]],columns=[('a', 'b'),'b','c']) 
print (df) 
    (a, b) b c 
0  2 3 4 
1  3 4 5 

print (df[('a','b')]) 
0 2 
1 3 
Name: (a, b), dtype: int64 
3
df = pd.DataFrame([[2,3,4],[3,4,5]],columns=[('a','b','c']) 
df.columns 

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

あなただけ'a', 'b', 'c'キーが終了、('a','b')キーを持っていない...

3

タプルも使用されていますMultiIndexを使用してDataFrameから列を選択するには:

import pandas as pd 
columns = pd.MultiIndex.from_arrays([['a','b','c'], ['X','Y','Z']]) 
df = pd.DataFrame([[2,3,4],[3,4,5]], columns=columns) 
# a b c 
# X Y Z 
# 0 2 3 4 
# 1 3 4 5 

次いでタプルの

In [203]: df[('a','X')] 
Out[203]: 
0 2 
1 3 
Name: (a, X), dtype: int64 

リストは、各タプルは、一つの列を指定すると、複数の列を選択する:

In [204]: df[[('a','X'), ('b','Y')]] 
Out[204]: 
    a b 
    X Y 
0 2 3 
1 3 4 

DataFrame.__getitem__は、この動作を生成するためにチェックを入力使用:

# lists are handled here ----------------------vvvv 
    if isinstance(key, (Series, np.ndarray, Index, list)): 
     # either boolean or fancy integer index 
     return self._getitem_array(key) 
    elif isinstance(key, DataFrame): 
     return self._getitem_frame(key) 
    # tuples are handled here when self has a MultiIndex 
    elif is_mi_columns: 
     return self._getitem_multilevel(key) 
    # or else here 
    else: 
     return self._getitem_column(key) 
関連する問題