为什么传递元组会导致pandas出现关键错误?

时间:2016-06-21 20:09:44

标签: python pandas

我知道如果我传递列名的列表,我可以选择多个列。我很惊讶地发现我无法传递列名的元组

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

这是为什么?有什么重要的东西我不见了吗?据我所知,唯一的区别是第二种情况,多键是不可变的。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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'),只有'a', 'b', 'c'个密钥退出..

答案 2 :(得分: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)