我有一个数据帧,包含商品的多个属性(此处仅显示价格),索引在元组(位置、名称、类型)上:
df = pd.DataFrame.from_dict({'price': {
('DE', 'Coal', 'Stock'): 2,
('DE', 'Gas', 'Stock'): 4,
('DE', 'Elec', 'Demand'): 1,
('FR', 'Gas', 'Stock'): 5,
('FR', 'Solar', 'SupIm'): 0,
('FR', 'Wind', 'SupIm'): 0}})
df.index = pd.MultiIndex.from_tuples(df.index, names=['Sit', 'Com', 'Type'])
更具可读性:
^{pr2}$我的问题:我如何简明地将Type == "Stock"
为真的所有行的属性price
相乘?在
我只发现了以下内容,包括临时重置索引以将Type
作为列进行访问。有没有可能更直接地做同样的事情,直接在指数上做比较?在
df = df.reset_index()
df.loc[df['Type'] == 'Stock', 'price'] *= 2
df.set_index(['Sit', 'Com', 'Type'])
我想写些什么-有点:
df.loc[(:, :, 'Stock'), 'price'] *= 2
编辑(解决方案):感谢unutbu提出了布尔掩蔽的思想,Jeff指出了lexsordered问题,这使我得以修复代码,最终如下所示:
df.sortlevel(0, inplace=True) # ensures that df is lexsorted
mask = (df.index.get_level_values('Type') == 'Stock')
df.loc[mask, 'price'] *= 2
相关问题 更多 >
编程相关推荐