gpt4 book ai didi

python - 替换 Pandas 多索引中的值

转载 作者:太空宇宙 更新时间:2023-11-03 11:24:51 25 4
gpt4 key购买 nike

我有一个带有多索引的数据框。当满足第一个索引的某些条件时,我想更改第二个索引的值。我在这里发现了一个类似(但不同)的问题:Replace a value in MultiIndex (pandas)这没有回答我的观点,因为那是关于更改单行,并且解决方案也传递了第一个索引的值(不需要更改)。就我而言,我正在处理多行,但我无法根据我的情况调整该解决方案。

我的数据的一个最小示例如下。谢谢!

import pandas as pd
import numpy as np

consdf=pd.DataFrame()

for mylocation in ['North','South']:
for scenario in np.arange(1,4):
df= pd.DataFrame()
df['mylocation'] = [mylocation]
df['scenario']= [scenario]
df['this'] = np.random.randint(10,100)
df['that'] = df['this'] * 2
df['something else'] = df['this'] * 3
consdf=pd.concat((consdf, df ), axis=0, ignore_index=True)

mypiv = consdf.pivot('mylocation','scenario').transpose()

level_list =['this','that']
# if level 0 is in level_list --> set level 1 to np.nan
mypiv.iloc[mypiv.index.get_level_values(0).isin(level_list)].index.set_levels([np.nan], level =1, inplace=True)

最后一行不起作用:我得到:

ValueError: On level 1, label max (2) >= length of level  (1). NOTE: this index is in an inconsistent state

最佳答案

IIUC 您可以将新值添加到级别值,然后使用 advanced indexing 更改索引的标签, get_level_values , set_levelsset_labels方法:

len_ind = len(mypiv.loc[(level_list,)].index.get_level_values(1))
mypiv.index.set_levels([1, 2, 3, np.nan], level=1, inplace=True)
mypiv.index.set_labels([3]*len_ind + mypiv.index.labels[1][len_ind:].tolist(), level=1, inplace=True)

In [219]: mypiv
Out[219]:
mylocation North South
scenario
this NaN 26 46
NaN 32 67
NaN 75 30
that NaN 52 92
NaN 64 134
NaN 150 60
something else 1.0 78 138
2.0 96 201
3.0 225 90

注意您在其他场景 中的值将转换为 float,因为它应该是一种类型,而 np.nan 具有 float 类型。

关于python - 替换 Pandas 多索引中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36111716/

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