如何更改 Pandas 中 MultiIndex Dataframe 的列中某些行的值

How to change the values of certain rowns in a column of a MultiIndex Dataframe in Pandas

我有一个包含以下列的数据框 (df):

print(df.columns)
['A','B','C','D','E']

并且假设所有列都有数字作为数据。

然后我select一些列成为索引

Index = ['A','B','C']
df.set_index(Index).sort_index()

我以这种方式使用它 analysis.At 当索引 'C' 具有某些值时,我需要更改列 'E' 的行,例如:

df.loc[df[(slice(None,None),slice(None,None),slice(5,10))], 'E' ] = 6

这显然行不通。我尝试了很多不同的方法:使用元组和切片作为索引,如我上面的行所示,重新排列索引以便我可以使用单个切片(将 'C' 移动到第一级),尝试使用.xs(横截面)等,我做不到。 (我一直在研究 .loc、.xs 等的文档)我没有找到一个例子可以做到这一点,也没有找到确定的答案,这是不可能的。现在我能够做到以下几点:

df.reset_index(inplace=True) # returning it back into a normal DataFrame
df.loc[(DataFrame['C'] >= 5) & (df['C'] <= 10),'E'] = 6 # Modifying normally based on column data
df.set_index(Index).sort_index() # bring it back to a multiindex

但这似乎不对。在我看来,索引应该能够以某种方式被切片,我只是找不到如何。也许我没有在 Google 上搜索正确的术语。如果有人能帮助我或指出正确的方向,我将不胜感激。

您可以使用 df.index.get_level_values('C')——其中 returns 值的索引数组——如下所示。

import pandas as pd

df = pd.DataFrame(np.random.randint(0,10,size=(100, 5)), columns=list('ABCDE'))
df = df.set_index(['A','B','C']).sort_index()

df.loc[(df.index.get_level_values('C') <= 10) & (df.index.get_level_values('C') >= 5), 'E'] = 6

print(df)

结果:

       D  E                                              
A B C                                                    
0 0 6  3  6                                              
  2 0  6  1                                              
    7  2  6                                              
  3 6  5  6                                              
    9  1  6                                              
...   .. ..                                              
9 3 3  5  0                                              
    6  6  6                                              
  4 3  5  7                                              
    7  6  6                                              
  6 8  6  6             

注意:.get_level_values() 两边的括号是必需的,否则答案不明确,会引发错误。