我有一个pandas数据框,其索引如下:
df.index
['a_1', 'b_2', 'c_3', ... ]
我想将这些索引重命名为:
['a', 'b', 'c', ... ]
如何在不指定具有每个索引值的显式键的字典的情况下执行此操作? 我试过了:
df.rename( index = lambda x: x.split( '_' )[0] )
但这会引发错误:
AssertionError: New axis must be unique to rename
答案 0 :(得分:5)
也许你可以通过使用MultiIndex来获得两全其美:
import numpy as np
import pandas as pd
df = pd.DataFrame(np.arange(8).reshape(4,2), index=['a_1', 'b_2', 'c_3', 'c_4'])
print(df)
# 0 1
# a_1 0 1
# b_2 2 3
# c_3 4 5
# c_4 6 7
index = pd.MultiIndex.from_tuples([item.split('_') for item in df.index])
df.index = index
print(df)
# 0 1
# a 1 0 1
# b 2 2 3
# c 3 4 5
# 4 6 7
这样,您可以根据索引的第一级访问内容:
In [30]: df.ix['c']
Out[30]:
0 1
3 4 5
4 6 7
或根据指数的两个级别:
In [31]: df.ix[('c','3')]
Out[31]:
0 4
1 5
Name: (c, 3)
此外,所有DataFrame方法都是为了与MultiIndices的DataFrames一起使用而构建的,所以你什么都不会丢失。
但是,如果你真的想要删除索引的第二级,你可以这样做:
df.reset_index(level=1, drop=True, inplace=True)
print(df)
# 0 1
# a 0 1
# b 2 3
# c 4 5
# c 6 7
答案 1 :(得分:3)
如果你的函数产生了重复的索引值,那就是你得到的错误:
>>> df = pd.DataFrame(np.random.random((4,3)),index="a_1 b_2 c_3 c_4".split())
>>> df
0 1 2
a_1 0.854839 0.830317 0.046283
b_2 0.433805 0.629118 0.702179
c_3 0.390390 0.374232 0.040998
c_4 0.667013 0.368870 0.637276
>>> df.rename(index=lambda x: x.split("_")[0])
[...]
AssertionError: New axis must be unique to rename
如果你真的想要,我会使用列表comp:
>>> df.index = [x.split("_")[0] for x in df.index]
>>> df
0 1 2
a 0.854839 0.830317 0.046283
b 0.433805 0.629118 0.702179
c 0.390390 0.374232 0.040998
c 0.667013 0.368870 0.637276
但是我想一想这是否真的是正确的方向。