如何获取/设置 pandas 索引列标题或名称?
- 2025-03-06 08:55:00
- admin 原创
- 93
问题描述:
如何在 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"]
有人知道怎么做吗?
解决方案 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
解决方案 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+
可以使用参数index
和columns
:
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
解决方案 3:
df.index.name
应该可以解决问题。
Python 有一个dir
函数可以让你查询对象属性。dir(df.index)
在这里很有帮助。
解决方案 4:
如果您不想创建新行而只是将其放在空单元格中,则使用:
df.columns.name = 'foo'
否则使用:
df.index.name = 'foo'
解决方案 5:
用于df.index.rename('foo', inplace=True)
设置索引名称。
这个 api 似乎从pandas 0.13开始可用。
解决方案 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:
1. 用于pd.Index
命名构造中的索引(或列)
Pandas 有Index
( MultiIndex
) 个接受名称的对象。在数据框构造中将这些对象作为索引或列传递,可以构造具有命名索引/列的框架。
data = {'Column 1': [1,2,3,4], 'Index Title': ["Apples","Oranges","Puppies","Ducks"]}
# for RangeIndex
df = pd.DataFrame(data, index=pd.Index(range(4), name='foo'))
# ^^^^^^^^ <---- here
# for Index
df = pd.DataFrame(data, index=pd.Index(data['Index Title'], name='foo'))
# ^^^^^^^^ <---- here
# for columns
df = pd.DataFrame(data, columns=pd.Index(data.keys(), name='foo'))
# ^^^^^^^^ <---- here
# for MultiIndex
df = pd.DataFrame(data, index=pd.MultiIndex.from_arrays([['Fruit', 'Fruit', 'Animal', 'Animal'], data['Index Title']], names=['foo', 'bar']))
# ^^^^^^^^^^^^^ <---- here
2. 更改 MultiIndex 级别名称
如果数据框具有 MultiIndex 并且必须更改特定级别的索引名称,index.set_names
则可以使用。例如,要更改第二个索引级别的名称,请使用以下命令。别忘了inplace=True
。
df.index.set_names('foo', level=1, inplace=True)
# equivalently, rename could be used with a dict
df.index.rename({'Index Title 2': 'foo'}, inplace=True)
set_names
也可以用于常规索引(集合level=None
)。不过,rename_axis
可能更容易。
df.index.set_names('foo', level=None, inplace=True)
# equivalent to the following
df.index.name = 'foo'
df = df.rename_axis('foo')
与列有对应关系columns.set_names
。
df.columns.set_names('foo', level=None, inplace=True)
# equivalent to
df = df.rename_axis(columns='foo')
# for MultiIndex columns
df.columns.set_names('foo', level=0, inplace=True)
解决方案 10:
从最新版本的 pandas 开始,仅获取索引列名称df.index.names
将适用于单个索引或多索引。
作为一个在尝试寻找获取索引名称+列名列表的最佳方法时发现这个问题的人,我会发现这个答案很有用:
names = list(filter(None, df.index.names + df.columns.values.tolist()))
这适用于无索引、单列索引或多索引。它避免调用 reset_index(),因为对于这样一个简单的操作,这会造成不必要的性能损失。我很惊讶没有内置方法(我遇到过)。我想我更经常需要这个,因为我正在从数据库中传输数据,其中数据框索引映射到主键/唯一键,但对我来说实际上只是另一列。
扫码咨询,免费领取项目管理大礼包!