我已经采用了数据框(初始索引0 ... 9999),并按年度划分:
requests_df = {year : df[df['req_year'] == year] for year in df['req_year'].unique()}
按照往常,每个子框架都保留了自己的索引排序。然后,在尝试对这些孤立帧之一索引(df_yr = requests_df[2015]
)时,我得到了这种非常出乎意料的行为:
for idx in df_year.index:
qty = frame[idx]['qty_tickets']
原因:
KeyError Traceback (most recent call last)
/home/user/ve/ml/lib/python3.5/site-packages/pandas/indexes/base.py in get_loc(self, key, method, tolerance)
2133 try:
-> 2134 return self._engine.get_loc(key)
2135 except KeyError:
pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:4433)()
pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:4279)()
pandas/src/hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13742)()
pandas/src/hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13696)()
KeyError: 8666
以为我在迭代器上愚弄了,我尝试了一个简单的情况:
df_yr[df_yr.index[0]]
KeyError
wat。
8666绝对是第一行的索引值:
Int64Index([8666, 8667, 8668, 8669, 8670, 8671, 8672, 8673, 8674, 8675,
...
9830, 9831, 9832, 9833, 9834, 9835, 9836, 9837, 9838, 9839],
dtype='int64', length=1174)
使用LOC索引
outframe.loc[8666]
我依赖于df.Index值,效果很好。 wat。
df.ix也有效,这不是太令人惊讶,因为它具有内置的后备。
我已经使用DF.Index的操作索引了很多时间。什么给?
通常,df[index]
将执行基于的列标签。正如您注意到的那样,例外是
-
df[slice]
将切成行 -
df[boolean_mask]
将根据掩码选择一个行的子集
除这两个例外外,没有有效的方法来消除歧义df[row_label]
和df[col_label]
,因此Pandas使用后一种解释,因为它与"类似字典"的数据框架更一致。您使用df_yr[df_yr.index[0]]
的实验引发了错误
相反,使用基于多轴标签的索引,该语法为
df.loc[row_indexer, col_indexer]
其中col_indexer
是可选的。df.loc[df.index[0]]
应该正常工作。在您的代码的破损部分中,使用
frame.loc[idx, 'qty_tickets']
(Jezrael在评论中也指出)。