我有一个熊猫数据框,其索引如下:
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
也许您可以通过使用 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 的 DataFrame 而构建的,因此您不会丢失任何东西。
但是,如果您真的想删除索引的第二级,您可以这样做:
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
如果您的函数产生重复的索引值,这就是您会得到的错误:
>>> 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
如果你真的想要那个,我会使用一个列表组合:
>>> 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
但我会考虑这是否真的是正确的方向。