2013-05-16 18 views
5

ich Pandas Datenrahmen, deren Indizes wie folgt aussehen:Umbenennungsindex eines Pandas Datenrahmen

df.index 
['a_1', 'b_2', 'c_3', ... ] 

ich diese Indizes umbenennen möchten:

['a', 'b', 'c', ... ] 

Wie kann ich dies tun, ohne ein Wörterbuch Angabe mit expliziten Schlüsseln für jeden Indexwert?
Ich habe versucht:

df.rename(index = lambda x: x.split('_')[0]) 

aber einen Fehler wirft:

AssertionError: New axis must be unique to rename 

Antwort

3

, dass der Fehler ist Sie, wenn Ihre Funktion erzeugt doppelte Indexwerte erhalten würde:

>>> 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 

Wenn Sie Das möchte ich wirklich, ich würde eine Liste verwenden 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 

aber ich würde darüber nachdenken, ob das wirklich die richtige Richtung ist.

+0

dank der Fehler nun mehr Sinn macht. – user1486457

5

Vielleicht könnten Sie das Beste aus beiden Welten von einem Multiindex mit:

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 

Auf diese Weise können Sie die Dinge Zugriff gemäß der ersten Ebene des Index:

In [30]: df.ix['c'] 
Out[30]: 
    0 1 
3 4 5 
4 6 7 

oder nach Beide Ebenen des Index:

In [31]: df.ix[('c','3')] 
Out[31]: 
0 4 
1 5 
Name: (c, 3) 

Darüber hinaus sind alle DataFrame-Methoden gebaut, um w zu arbeiten ie DataFrames mit MultiIndices, damit Sie nichts verlieren.

Wenn Sie jedoch wirklich die zweite Ebene des Index löschen möchten, können Sie dies tun:

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