Pandas Series .loc() 附加后访问错误
Posted
技术标签:
【中文标题】Pandas Series .loc() 附加后访问错误【英文标题】:Pandas Series .loc() access error after appending 【发布时间】:2014-03-11 04:45:17 【问题描述】:我有一个多索引熊猫系列,如下所示。我想向multi_df
添加一个新条目(new_series
),称之为multi_df_appended
。但是,当我尝试访问不存在的多索引时,我不明白 multi_df
和 multi_df_appended
之间的行为变化。
下面是重现问题的代码。我希望倒数第二行代码:multi_df_appended.loc['five', 'black', 'hard', 'square' ]
像使用multi_df
一样返回一个空系列,但我得到了给出的错误。我在这里做错了什么?
df = pd.DataFrame('id' : range(1,9),
'code' : ['one', 'one', 'two', 'three',
'two', 'three', 'one', 'two'],
'colour': ['black', 'white','white','white',
'black', 'black', 'white', 'white'],
'texture': ['soft', 'soft', 'hard','soft','hard',
'hard','hard','hard'],
'shape': ['round', 'triangular', 'triangular','triangular','square',
'triangular','round','triangular']
, columns= ['id','code','colour', 'texture', 'shape'])
multi_df = df.set_index(['code','colour','texture','shape']).sort_index()['id']
# try to access a non-existing multi-index combination:
multi_df.loc['five', 'black', 'hard', 'square' ]
Series([], dtype: int64) # returns an empty Series as desired/expected.
# append multi_df with a new row
new_series = pd.Series([9], index = [('four', 'black', 'hard', 'round')] )
multi_df_appended = multi_df.append(new_series)
# now try again to access a non-existing multi-index combination:
multi_df_appended.loc['five', 'black', 'hard', 'square' ]
error: 'MultiIndex lexsort depth 0, key was length 4' # now instead of the empty Series, I get an error!?
【问题讨论】:
这两个都在 0.13.1 中提出;你的第一个键不存在所以你得到一个KeyError
,第二个错误是不言自明的,见这里:pandas-docs.github.io/pandas-docs-travis/…
@Jeff,谢谢。我并没有因为multi_df.loc['five', 'black', 'hard', 'square' ]
而真正得到错误,KeyError
是什么意思?使用multi_df_appended.loc['five', 'black', 'hard', 'square' ]
,我得到 lexsort 部门错误。所以,我尝试了multi_df_appended.sortlevel(X)
,在尝试访问不存在的索引之前,我用 0,1,2,3 替换了 X,但我仍然得到相同的 lexsort depth 错误。
你分配了一个新值吗?大多数方法返回一个新对象
@Jeff,好的,谢谢。如果我在 append() 之后添加.sortlevel(0)
。有用。我将其添加为答案。从文档中,我不完全理解为什么这是必要的。或者为什么我应该特别包含 .sortlevel(0)
而不是 .sortlevel(3)
。
【参考方案1】:
正如@Jeff 回答的那样,如果我执行.sortlevel(0)
然后为未知索引运行.loc()
,它不会给出“lexsort depth”错误:
multi_df_appended_sorted = multi_df.append(new_series).sortlevel(0)
multi_df_appended_sorted.loc['five', 'black', 'hard', 'square' ]
Series([], dtype: int64)
【讨论】:
gr8。通常,这就是您希望事先创建多索引框架(并对其进行排序)的原因,可能已经具有 nan 值。查看pandas.pydata.org/pandas-docs/stable/…以上是关于Pandas Series .loc() 附加后访问错误的主要内容,如果未能解决你的问题,请参考以下文章
pandas使用loc函数iloc函数索引单个数据列,但是生成的数据对象是dataframe而不是Series对象(selecting a single column in dataframe)
2pandas数据结构之Series——选取Series子集