我知道如果我传递列名的列表,我可以选择多个列。我很惊讶地发现我无法传递列名的元组。
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
这是为什么?有什么重要的东西我不见了吗?据我所知,唯一的区别是第二种情况,多键是不可变的。
答案 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)