Pandas:进入多指标水平进行就地操作

2024-04-25 01:03:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧,包含商品的多个属性(此处仅显示价格),索引在元组(位置、名称、类型)上:

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

Tags: fromcomdfindex属性typestockde
1条回答
网友
1楼 · 发布于 2024-04-25 01:03:55
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

相关问题 更多 >