注意:因为我问过这个问题,.ix但仍然存在但是或多或少已被.loc基于标签的索引和.iloc位置索引所取代.
在阅读了文档之后ix的DataFrames方法,我对我的MultiIndexed DataFrame(指定索引的选择列)的以下行为感到有些困惑.
In [57]: metals
Out[57]:
<class 'pandas.core.frame.DataFrame'>
MultiIndex: 24245 entries, (u'BI', u'Arsenic, Dissolved', -2083768576.0, 1.0)
to (u'WC', u'Zinc, Total', 1661183104.0, 114.0)
Data columns:
Inflow_val 20648 non-null values
Outflow_val 20590 non-null values
Inflow_qual 20648 non-null values
Outflow_qual 20590 non-null values
dtypes: float64(2), object(2)
In [58]: metals.ix['BI'].shape # first column in the index, ok
Out[58]: (3368, 4)
In [59]: metals.ix['BI', :, :, :].shape # first + other columns, ok
Out[59]: (3368, 4)
In [60]: metals.ix['BI', 'Arsenic, Dissolved'].shape # first two cols
Out[60]: (225, 4)
In [61]: metals.ix['BI', 'Arsenic, Dissolved', :, :].shape # first two + all others
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-62-1fb577ec32fa> in <module>()
----> 1 metals.ix['BI', 'Arsenic, Dissolved', :, :].shape
# traceback spaghetti snipped
KeyError: 'no item named Arsenic, Dissolved'
In [62]: metals.ix['BI', 'Arsenic, Dissolved', :, 1.0].shape # also fails
Run Code Online (Sandbox Code Playgroud)
我花了很长时间才意识到我一直试图实现的目标In [61]是可能的In [60].为什么该ix方法的行为如下?我真正想要的是那个场景In [62].
我的猜测是我需要重新定义索引层次结构,但我很好奇是否有更简单的方法.
谢谢.
如果你想根据MultiIndex级别值选择行/列,我建议使用'.xs()'方法.另请参阅使用复合(分层)索引从Pandas数据框中选择行
对于此示例,您可以使用:
#short hand:
metals.xs('BI', level=0).xs('Arsenic, Dissolved', level=0).xs(1, level=1)
# more verbose
metals.xs('BI', level='bmp_category').xs('Arsenic, Dissolved', level='parameter').xs(1, level='storm')
# two chained `ix` calls:
metals.ix['BI', 'Arsenic, Dissolved'].ix[:, 1]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20393 次 |
| 最近记录: |