【问题标题】:How to change the values of certain rowns in a column of a MultiIndex Dataframe in Pandas如何在 Pandas 中更改 MultiIndex 数据框列中某些行的值
【发布时间】:2021-05-28 09:44:24
【问题描述】:

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

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

让我们假设所有的列都有数字作为数据。

然后我选择一些列成为索引

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

我用这种方式进行一些分析。有时,当索引“C”具有某些值时,我需要更改“E”列的行,例如:

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

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

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 上搜索正确的术语。如果有人能帮我一把或指出正确的方向,我将不胜感激。

【问题讨论】:

    标签: python pandas numpy slice


    【解决方案1】:

    您可以使用df.index.get_level_values('C')--返回值的索引数组--如下所示。

    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()s 两边的括号都是必需的,否则答案会模棱两可,并会引发错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-28
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2016-05-27
      • 1970-01-01
      • 2021-04-12
      • 1970-01-01
      相关资源
      最近更新 更多