gpt4 book ai didi

python - Pandas:访问MultiIndex的级别以进行就地操作

转载 作者:行者123 更新时间:2023-12-01 05:08:53 25 4
gpt4 key购买 nike

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

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'])

更具可读性:

                  price
Sit Com Type
DE Coal Stock 2
Elec Demand 1
Gas Stock 4
FR Gas Stock 5
Solar SupIm 0
Wind SupIm 0

我的问题:如何简洁地乘以属性 price所有行中 Type == "Stock"是真的吗?

我只找到以下内容,涉及临时重置索引以访问 Type作为一个列。是否可以通过直接对索引进行比较来更直接地执行相同的操作?

df = df.reset_index()
df.loc[df['Type'] == 'Stock', 'price'] *= 2
df.set_index(['Sit', 'Com', 'Type'])

我想写的内容 - 大概是:

df.loc[(:, :, 'Stock'), 'price'] *= 2

编辑(解决方案):感谢unutbu对于 bool 掩码想法和 Jeff指出了词法排序问题,这使我能够修复我的代码,最终看起来像这样:

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

关于python - Pandas:访问MultiIndex的级别以进行就地操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24572040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com