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