给定一个具有3个级别的multiindex的框架:

import pandas as pd

df = pd.concat({'a': pd.Series([1,2,3,1]),
                'b': pd.Series([5,4,3,5]),
                'c': pd.Series(range(9,13)),
                'd': pd.Series(range(13,17))}, axis=1).set_index(['a', 'b', 'c'])
>>>         d
    a b c       
    1 5 9   13
    2 6 10  14
    3 7 11  15
    4 8 12  16

我想使用loc与前两个级别的索引列表:

idx = pd.MultiIndex.from_arrays([[1, 2], [5, 4]], names=('a', 'b'))
>>> MultiIndex([(1, 5),
                (2, 6)],
               names=['a', 'b'])

我try 将.loc与单个索引一起使用:

df.loc[idx[0]]
>>>      d
    c     
    9   13
    12  16

df.loc[idx[1]]
>>>      d
    c     
    10  14

我预计df.loc[idx]返回的结果与

pd.concat([df.loc[i] for i in idx])
>>>     d
    c     
    9   13
    12  16
    10  14

但I df.loc[idx]退货

ValueError: operands could not be broadcast together with shapes (2,2) (3,) (2,2)

有比pd.concat([df.loc[i] for i in idx])更干净的东西来获得预期的结果吗?

推荐答案

loc的多重索引需要相同的级别,解决方法可能是将额外的级别临时设置为列:

levels = df.index.names.difference(idx.names)

out = df.reset_index(levels).loc[idx].set_index(levels, append=True)

join:

out = df.join(pd.DataFrame(index=idx), how='right')

输出:

         d
a b c     
1 5 9   13
    12  16
2 4 10  14

如果您想在此过程中丢弃a/b:

levels = df.index.names.difference(idx.names)
out = df.reset_index(levels).loc[idx].set_index(levels)

或者:

out = df.join(pd.DataFrame(index=idx), how='right').droplevel(idx.names)

输出:

     d
c     
9   13
12  16
10  14

Python相关问答推荐

如何推迟对没有公钥的视图/表的反射?

try 使用tensorFlow.keras.models时optree Import错误

如果我已经使用了time,如何要求Python在12秒后执行另一个操作.sleep

"如果发生特定错误,返回值

为什么dict(id=1,**{id:2})有时会引发KeyMessage:id而不是TypMessage?

ambda将时间戳与组内另一列的所有时间戳进行比较

Pythind 11无法弄清楚如何访问tuple元素

如何自动抓取以下CSV

滚动和,句号来自Pandas列

当使用keras.utils.Image_dataset_from_directory仅加载测试数据集时,结果不同

对某些列的总数进行民意调查,但不单独列出每列

如何制作10,000年及以后的日期时间对象?

如何在python polars中停止otherate(),当使用when()表达式时?

Streamlit应用程序中的Plotly条形图中未正确显示Y轴刻度

海上重叠直方图

导入...从...混乱

不能使用Gekko方程'

* 动态地 * 修饰Python中的递归函数

基于另一列的GROUP-BY聚合将列添加到Polars LazyFrame

具有相同图例 colored颜色 和标签的堆叠子图