【问题标题】:Pandas index column title or namePandas 索引列标题或名称
【发布时间】:2013-08-04 01:48:37
【问题描述】:

如何在 python pandas 中获取索引列名?这是一个示例数据框:

             Column 1
Index Title          
Apples              1
Oranges             2
Puppies             3
Ducks               4  

我要做的是获取/设置数据框索引标题。这是我尝试过的:

import pandas as pd
data = {'Column 1'     : [1., 2., 3., 4.],
        'Index Title'  : ["Apples", "Oranges", "Puppies", "Ducks"]}
df = pd.DataFrame(data)
df.index = df["Index Title"]
del df["Index Title"]
print df

有人知道怎么做吗?

【问题讨论】:

    标签: python pandas dataframe columnname


    【解决方案1】:

    您可以通过其name 属性获取/设置索引

    In [7]: df.index.name
    Out[7]: 'Index Title'
    
    In [8]: df.index.name = 'foo'
    
    In [9]: df.index.name
    Out[9]: 'foo'
    
    In [10]: df
    Out[10]: 
             Column 1
    foo              
    Apples          1
    Oranges         2
    Puppies         3
    Ducks           4
    

    【讨论】:

    • 截至目前(0.16)它不起作用。或者更确切地说 - 它确实有效,但是一旦 DataFrame 被修改,它就会删除索引名称。
    • 应该可以在 DataFrame 创建时指定索引名称。例如pd.DataFrame(values,index={"INDEX_NAME":index_values})。我不明白为什么不允许或执行此操作?
    • 可以直接用Index构造添加名称
    • @Jeff,看起来您的观察认为首先构建索引(并将其用于数据帧的索引和列)是正确的方法,尽管我同意@denfromufa 它应该将字典作为参数从 pandas.DataFrame 构造
    • 如果是Multiindex,使用df.index.names而不是df.index.name
    【解决方案2】:

    您可以使用rename_axis,删除设置为None

    d = {'Index Title': ['Apples', 'Oranges', 'Puppies', 'Ducks'],'Column 1': [1.0, 2.0, 3.0, 4.0]}
    df = pd.DataFrame(d).set_index('Index Title')
    print (df)
                 Column 1
    Index Title          
    Apples            1.0
    Oranges           2.0
    Puppies           3.0
    Ducks             4.0
    
    print (df.index.name)
    Index Title
    
    print (df.columns.name)
    None
    

    新功能在方法链中运行良好。

    df = df.rename_axis('foo')
    print (df)
             Column 1
    foo              
    Apples        1.0
    Oranges       2.0
    Puppies       3.0
    Ducks         4.0
    

    您也可以使用参数axis重命名列名:

    d = {'Index Title': ['Apples', 'Oranges', 'Puppies', 'Ducks'],'Column 1': [1.0, 2.0, 3.0, 4.0]}
    df = pd.DataFrame(d).set_index('Index Title').rename_axis('Col Name', axis=1)
    print (df)
    Col Name     Column 1
    Index Title          
    Apples            1.0
    Oranges           2.0
    Puppies           3.0
    Ducks             4.0
    
    print (df.index.name)
    Index Title
    
    print (df.columns.name)
    Col Name
    
    print df.rename_axis('foo').rename_axis("bar", axis="columns")
    bar      Column 1
    foo              
    Apples        1.0
    Oranges       2.0
    Puppies       3.0
    Ducks         4.0
    
    print df.rename_axis('foo').rename_axis("bar", axis=1)
    bar      Column 1
    foo              
    Apples        1.0
    Oranges       2.0
    Puppies       3.0
    Ducks         4.0
    

    从版本pandas 0.24.0+ 可以使用参数indexcolumns

    df = df.rename_axis(index='foo', columns="bar")
    print (df)
    bar      Column 1
    foo              
    Apples        1.0
    Oranges       2.0
    Puppies       3.0
    Ducks         4.0
    

    删除索引和列名意味着将其设置为None

    df = df.rename_axis(index=None, columns=None)
    print (df)
             Column 1
    Apples        1.0
    Oranges       2.0
    Puppies       3.0
    Ducks         4.0
    

    如果MultiIndex 仅在索引中:

    mux = pd.MultiIndex.from_arrays([['Apples', 'Oranges', 'Puppies', 'Ducks'],
                                      list('abcd')], 
                                      names=['index name 1','index name 1'])
    
    
    df = pd.DataFrame(np.random.randint(10, size=(4,6)), 
                      index=mux, 
                      columns=list('ABCDEF')).rename_axis('col name', axis=1)
    print (df)
    col name                   A  B  C  D  E  F
    index name 1 index name 1                  
    Apples       a             5  4  0  5  2  2
    Oranges      b             5  8  2  5  9  9
    Puppies      c             7  6  0  7  8  3
    Ducks        d             6  5  0  1  6  0
    

    print (df.index.name)
    None
    
    print (df.columns.name)
    col name
    
    print (df.index.names)
    ['index name 1', 'index name 1']
    
    print (df.columns.names)
    ['col name']
    

    df1 = df.rename_axis(('foo','bar'))
    print (df1)
    col name     A  B  C  D  E  F
    foo     bar                  
    Apples  a    5  4  0  5  2  2
    Oranges b    5  8  2  5  9  9
    Puppies c    7  6  0  7  8  3
    Ducks   d    6  5  0  1  6  0
    
    df2 = df.rename_axis('baz', axis=1)
    print (df2)
    baz                        A  B  C  D  E  F
    index name 1 index name 1                  
    Apples       a             5  4  0  5  2  2
    Oranges      b             5  8  2  5  9  9
    Puppies      c             7  6  0  7  8  3
    Ducks        d             6  5  0  1  6  0
    
    df2 = df.rename_axis(index=('foo','bar'), columns='baz')
    print (df2)
    baz          A  B  C  D  E  F
    foo     bar                  
    Apples  a    5  4  0  5  2  2
    Oranges b    5  8  2  5  9  9
    Puppies c    7  6  0  7  8  3
    Ducks   d    6  5  0  1  6  0
    

    删除索引和列名意味着将其设置为None

    df2 = df.rename_axis(index=(None,None), columns=None)
    print (df2)
    
               A  B  C  D  E  F
    Apples  a  6  9  9  5  4  6
    Oranges b  2  6  7  4  3  5
    Puppies c  6  3  6  3  5  1
    Ducks   d  4  9  1  3  0  5
    

    对于索引和列中的MultiIndex,必须使用.names 而不是.name,并通过列表或元组设置:

    mux1 = pd.MultiIndex.from_arrays([['Apples', 'Oranges', 'Puppies', 'Ducks'],
                                      list('abcd')], 
                                      names=['index name 1','index name 1'])
    
    
    mux2 = pd.MultiIndex.from_product([list('ABC'),
                                      list('XY')], 
                                      names=['col name 1','col name 2'])
    
    df = pd.DataFrame(np.random.randint(10, size=(4,6)), index=mux1, columns=mux2)
    print (df)
    col name 1                 A     B     C   
    col name 2                 X  Y  X  Y  X  Y
    index name 1 index name 1                  
    Apples       a             2  9  4  7  0  3
    Oranges      b             9  0  6  0  9  4
    Puppies      c             2  4  6  1  4  4
    Ducks        d             6  6  7  1  2  8
    

    复数是检查/设置值的必要条件:

    print (df.index.name)
    None
    
    print (df.columns.name)
    None
    
    print (df.index.names)
    ['index name 1', 'index name 1']
    
    print (df.columns.names)
    ['col name 1', 'col name 2']
    

    df1 = df.rename_axis(('foo','bar'))
    print (df1)
    col name 1   A     B     C   
    col name 2   X  Y  X  Y  X  Y
    foo     bar                  
    Apples  a    2  9  4  7  0  3
    Oranges b    9  0  6  0  9  4
    Puppies c    2  4  6  1  4  4
    Ducks   d    6  6  7  1  2  8
    
    df2 = df.rename_axis(('baz','bak'), axis=1)
    print (df2)
    baz                        A     B     C   
    bak                        X  Y  X  Y  X  Y
    index name 1 index name 1                  
    Apples       a             2  9  4  7  0  3
    Oranges      b             9  0  6  0  9  4
    Puppies      c             2  4  6  1  4  4
    Ducks        d             6  6  7  1  2  8
    
    df2 = df.rename_axis(index=('foo','bar'), columns=('baz','bak'))
    print (df2)
    baz          A     B     C   
    bak          X  Y  X  Y  X  Y
    foo     bar                  
    Apples  a    2  9  4  7  0  3
    Oranges b    9  0  6  0  9  4
    Puppies c    2  4  6  1  4  4
    Ducks   d    6  6  7  1  2  8
    

    删除索引和列名意味着将其设置为None

    df2 = df.rename_axis(index=(None,None), columns=(None,None))
    print (df2)
    
               A     B     C   
               X  Y  X  Y  X  Y
    Apples  a  2  0  2  5  2  0
    Oranges b  1  7  5  5  4  8
    Puppies c  2  4  6  3  6  5
    Ducks   d  9  6  3  9  7  0
    

    还有@Jeff 解决方案:

    df.index.names = ['foo','bar']
    df.columns.names = ['baz','bak']
    print (df)
    
    baz          A     B     C   
    bak          X  Y  X  Y  X  Y
    foo     bar                  
    Apples  a    3  4  7  3  3  3
    Oranges b    1  2  5  8  1  0
    Puppies c    9  6  3  9  6  3
    Ducks   d    3  2  1  0  1  0
    

    【讨论】:

    • 我相信这应该是当前熊猫版本的公认答案
    • 另外值得注意的是,正如 phil 在另一个 df.index.rename('foo', inplace=True) 中建议的那样,请参阅 pandas.pydata.org/pandas-docs/stable/generated/…
    • 我已经导入了一个字典用作数据框,因此索引列自动设置为无,行编号为 1-10。但我想将“名称”列指定为索引。如果可能的话,在绘图期间这样做。是否有可能做到这一点,是否有可能在我们绘图时即时做到这一点?
    • jezrael 给出了原始问题的正确答案,即关于列索引名称,而不是行索引名称。加上完整的解释。基本上,要 Radical Edward 有索引列名,只需要使用 df.index.names
    【解决方案3】:

    df.index.name 应该可以解决问题。

    Python 有一个dir 函数,可以让您查询对象属性。 dir(df.index) 在这里很有帮助。

    【讨论】:

      【解决方案4】:

      使用df.index.rename('foo', inplace=True) 设置索引名称。

      似乎这个 api 从pandas 0.13 开始可用。

      【讨论】:

      • 哇...一个优雅的解决方案!
      【解决方案5】:

      如果您不想创建新行而只是将其放在空单元格中,请使用:

      df.columns.name = 'foo'
      

      否则使用:

      df.index.name = 'foo'
      

      【讨论】:

      • 刚刚发现它是列名的名称。难怪设置 df.index.name 会给你一个新的水平。谢谢!
      【解决方案6】:

      设置索引名称也可以在创建时完成:

      pd.DataFrame(data={'age': [10,20,30], 'height': [100, 170, 175]}, index=pd.Series(['a', 'b', 'c'], name='Tag'))
      

      【讨论】:

        【解决方案7】:

        df.columns.values 也给我们列名

        【讨论】:

          【解决方案8】:

          多索引的解决方案在 jezrael 的百科全书答案中,但我花了一段时间才找到它,所以我发布了一个新答案:

          df.index.names 给出多索引的名称(作为 Frozenlist)。

          【讨论】:

            【解决方案9】:

            从最新版本的 pandas 开始,仅获取索引列名称 df.index.names 将适用于单个索引或 MultiIndex。

            作为在尝试找到获取索引名称+列名称列表的最佳方法时发现此问题的人,我会发现此答案很有用:

            names = list(filter(None, df.index.names + df.columns.values.tolist()))
            

            这适用于无索引、单列索引或多索引。它避免了调用 reset_index() 对于这样一个简单的操作有不必要的性能损失。我很惊讶没有内置的方法(我遇到过)。我想我更经常需要这个,因为我正在从数据帧索引映射到主/唯一键的数据库中穿梭数据,但实际上对我来说只是另一列。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-07-10
              • 2013-02-21
              • 2017-08-21
              • 1970-01-01
              • 1970-01-01
              • 2014-05-21
              相关资源
              最近更新 更多