Python Pandas:访问用于就地操作的多索引级别

Python Pandas:访问用于就地操作的多索引级别,python,pandas,Python,Pandas,我有一个商品数据框,它具有多个属性(此处仅显示价格),通过(位置、名称、类型)元组进行索引: 更具可读性: price Sit Com Type DE Coal Stock 2 Elec Demand 1 Gas Stock 4 FR Gas Stock 5 Solar SupIm 0 Wind SupIm 0 我的问题:在Type==

我有一个商品数据框,它具有多个属性(此处仅显示价格),通过(位置、名称、类型)元组进行索引:

更具可读性:

                  price
Sit Com   Type
DE  Coal  Stock       2
    Elec  Demand      1
    Gas   Stock       4
FR  Gas   Stock       5
    Solar SupIm       0
    Wind  SupIm       0
我的问题:
Type==“Stock”
为true的所有行中,如何简明地将属性
price
相乘

我只发现了以下内容,包括临时重置索引以作为列访问
Type
。通过直接对索引进行比较,是否可以更直接地进行相同的操作

df = df.reset_index()
df.loc[df['Type'] == 'Stock', 'price'] *= 2
df.set_index(['Sit', 'Com', 'Type'])
我想写些什么——有点:

df.loc[(:, :, 'Stock'), 'price'] *= 2
编辑(解决方案):多亏了布尔掩蔽思想,并指出了lexsorted问题,这使我能够修复代码,最终看起来如下:

df.sortlevel(0, inplace=True)  # ensures that df is lexsorted
mask = (df.index.get_level_values('Type') == 'Stock')
df.loc[mask, 'price'] *= 2

谢谢你!对于将这些行传输到多列帧,我有一个奇怪的问题:
df.loc[mask,'price']
抛出一个
keyrerror:“键长度(2)大于多索引lexsort depth(0)”
。但是,我无法用显示的
df
和随机生成的第二列重现错误。我刚刚创建了一个,但是当我从那里重新创建数据帧时,
df.loc[mask,'price']*=2
工作得非常完美。深入挖掘以复制…请参见此处了解0.14.0中的新功能:;有时会出现错误的原因是索引总是必须进行lexsorted
df.sortlevel(0, inplace=True)  # ensures that df is lexsorted
mask = (df.index.get_level_values('Type') == 'Stock')
df.loc[mask, 'price'] *= 2
In [23]: mask = (df.index.get_level_values(2) == 'Stock')

In [24]: df.loc[mask] *= 2

In [25]: df
Out[25]: 
                  price
Sit Com   Type         
DE  Coal  Stock       4
    Elec  Demand      1
    Gas   Stock       8
FR  Gas   Stock      10
    Solar SupIm       0
    Wind  SupIm       0