Pandas索引列的标题或名称

我如何获得在python熊猫索引列名?这是一个数据框架的例子:

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

我要做的是获取/设置dataframe索引标题。以下是我的尝试:

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

有人知道怎么做吗?

894002 次浏览

你可以通过它的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

df.index.name应该做的把戏。

Python有一个dir函数,可以让你查询对象属性。dir(df.index)在这里是有用的。

如果你不想创建一个新行,而只是把它放在空单元格中,然后使用:

df.columns.name = 'foo'

否则使用:

df.index.name = 'foo'

df.columns.values也提供了列的名称

你可以使用rename_axis来移除set到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

@杰夫解决方案:

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

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

这个api似乎从熊猫0.13开始就可用了。

多指数的解决方案在jezrael的循环答案中,但我花了一段时间才找到它,所以我发布了一个新的答案:

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

为了获得索引列名,df.index.names将适用于最新版本的pandas的单个索引或MultiIndex。

作为一个在试图找到获得索引名+列名列表的最佳方法时发现这一点的人,我会发现这个答案很有用:

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

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

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

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