【问题标题】:Select from MultiIndex Columns从多索引列中选择
【发布时间】:2021-04-05 10:01:59
【问题描述】:

我已阅读有关从多索引列中进行选择的其他帖子,但它对我的方案没有帮助。

我有这样的示例列:

 ('', 'X', 'Name'),
 ('', 'Y', 'Name'),
 ('S1', 'X', 'OVERALL TOTALS OF ALL SUBJECTS'),
 ('S1', 'X', 'OVERALL PERCENTAGES OF ALL SUBJECTS'),
 ('S2', 'Y', 'OVERALL TOTALS OF ALL SUBJECTS'),
 ('S2', 'Y', 'OVERALL PERCENTAGES OF ALL SUBJECTS')
  1. 我想将 ('', 'Y', 'Name') 中的“Name”重命名为“Name2”。
  2. 我想将 ('', 'X', 'Name') 列中的所有值转换为标题大小写。

我尝试使用 df.get_level_values(2)df.set_levels(newlist, level=2) 尝试使用新的值列表更改列的名称,但我收到错误“级别值必须是唯一的”。我也试过df.rename(columns={('', 'Y', 'Name'): ('', 'Y', 'Name2')}, inplace=True),但没有任何反应。 df.rename(columns={'Name': 'Name2'}, level=2, inplace=True) 重命名两个“名称”,所以这也不起作用。

当我尝试df[[('', 'X', 'Name')]].str.lower() 时,我收到错误“'DataFrame' 对象没有属性 'str'”。不知道为什么会这样。此列 ('', 'Y', 'Name') 是所有名称,字符串也是。此外,df[[('', 'Y', 'Name')]].dtypes 返回“对象”。我怀疑这个错误又是由于我选择列的方式造成的。

我有多个要读取的文件,因此每个文件的列名可能不同。没有一个级别具有唯一的名称。但是,所有 3 个级别的组合始终是唯一的。

我需要在第 2 级处理一个非常具体的列。所以,我想要一种方法来可靠地选择一个这样的列,使用 df[('A', 'B', 'C')] 之类的东西来重命名列以及将其行值转换为小写。我该怎么做?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您必须重新创建 MultiIndex,如下所示:

    # create the dataframe
    cols = [('', 'X', 'Name'),
        ('', 'Y', 'Name'),
        ('S1', 'X', 'OVERALL TOTALS OF ALL SUBJECTS'),
        ('S1', 'X', 'OVERALL PERCENTAGES OF ALL SUBJECTS'),
        ('S2', 'Y', 'OVERALL TOTALS OF ALL SUBJECTS'),
        ('S2', 'Y', 'OVERALL PERCENTAGES OF ALL SUBJECTS')]
    df = pd.DataFrame(
        np.random.choice(['FOO', 'BAR', 'BAZ'], (3, len(cols))),
        columns=pd.MultiIndex.from_tuples(cols))
    
    # 1. Rename the column
    df.columns = pd.MultiIndex.from_tuples([
        x if x != ('', 'Y', 'Name') else ('', 'Y', 'Name2')
        for x in df.columns])
    
    # 2. Set value
    df['', 'X', 'Name'] = df['', 'X', 'Name'].str.title()
    
    # Print (transposed for readability)
    df.T
    

    输出:

                                                0    1    2
       X Name                                 Bar  Foo  Baz
       Y Name2                                BAR  BAR  BAZ
    S1 X OVERALL TOTALS OF ALL SUBJECTS       BAR  FOO  BAZ
         OVERALL PERCENTAGES OF ALL SUBJECTS  BAZ  BAR  BAR
    S2 Y OVERALL TOTALS OF ALL SUBJECTS       BAZ  BAZ  FOO
         OVERALL PERCENTAGES OF ALL SUBJECTS  BAZ  BAZ  FOO
    

    【讨论】:

      猜你喜欢
      • 2021-10-24
      • 2022-07-21
      • 2018-10-07
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      相关资源
      最近更新 更多