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_dfmulti_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子集

Python数据分析pandas真入门-----基础学习

Python数据分析pandas真入门-----基础学习

pandas中Series对象和DataFrame对象的索引

Pandas中loc,iloc与直接切片的区别