在 Pandas 中使用 .loc 和 MultiIndex
Posted
技术标签:
【中文标题】在 Pandas 中使用 .loc 和 MultiIndex【英文标题】:Using .loc with a MultiIndex in pandas 【发布时间】:2014-08-17 14:48:47 【问题描述】:有谁知道是否可以使用DataFrame.loc
方法从MultiIndex
中进行选择?我有以下DataFrame
并希望能够访问位于Dwell
列中的值,位于('at', 1)
、('at', 3)
、('at', 5)
等索引处(非顺序)。
我希望能够执行类似data.loc[['at',[1,3,5]], 'Dwell']
的操作,类似于常规索引的data.loc[[1,3,5], 'Dwell']
语法(返回由Dwell
值组成的3 成员系列)。
我的目的是选择数据的任意子集,仅对该子集执行一些分析,然后使用分析结果更新新值。我计划使用相同的语法为这些数据设置新值,因此在这种情况下链接选择器不会真正起作用。
这是我正在使用的DataFrame
的一部分:
Char Dwell Flight ND_Offset Offset
QGram
at 0 a 100 120 0.000000 0
1 t 180 0 0.108363 5
2 a 100 120 0.000000 0
3 t 180 0 0.108363 5
4 a 20 180 0.000000 0
5 t 80 120 0.108363 5
6 a 20 180 0.000000 0
7 t 80 120 0.108363 5
8 a 20 180 0.000000 0
9 t 80 120 0.108363 5
10 a 120 180 0.000000 0
【问题讨论】:
【参考方案1】:试试cross-section 索引:
In [68]: df.xs('at', level='QGram', drop_level=False).loc[[1,4]]
Out[68]:
Char Dwell Flight ND_Offset Offset
QGram
at 1 t 180 0 0.108363 5
4 a 20 180 0.000000 0
【讨论】:
这将是 pandas 文档推荐的方式,因为可以使用 xs 进行深度索引切片:pandas-docs.github.io/pandas-docs-travis/user_guide/… 还推荐xs
吗?
@baxx。是的,仍然推荐xs
。见pandas.pydata.org/pandas-docs/dev/user_guide/…【参考方案2】:
如果您使用的是 0.14 版本,您可以简单地将一个元组传递给 .loc
,如下所示:
df.loc[('at', [1,3,4]), 'Dwell']
【讨论】:
很有趣,因为如果你传递一个列表而不是一个元组,它就不能正常工作 @leoschet Pandas 将元组条目解释为级别,并将条目列表解释为级别中的项目。 pandas.pydata.org/pandas-docs/stable/user_guide/…仅供参考【参考方案3】:一般来说,MultiIndex 键采用元组的形式。例如:
In [6]: df.loc[('at', 1),'Dwell']
Out[6]: 180
在您的情况下,您必须传递一个元组列表。例如,以下代码可以正常工作:
In [7]: df.loc[ [('at', 1),('at', 3),('at', 5)], 'Dwell']
Out[7]:
Dwell
QGram
at 1 180
at 3 180
at 5 80
【讨论】:
更多信息可以在这里找到:pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html以上是关于在 Pandas 中使用 .loc 和 MultiIndex的主要内容,如果未能解决你的问题,请参考以下文章
在pandas中使用query替代loc进行高效简洁的条件筛选
在pandas中使用query替代loc进行高效简洁的条件筛选
在pandas中使用query替代loc进行高效简洁的条件筛选
Python pandas.DataFrame.loc函数方法的使用