Ich habe eine DF, die so aussieht:
df = pd.DataFrame(np.random.random((4,4)))
df.columns = pd.MultiIndex.from_product([['1','2'],['A','B']])
print df
1 2
A B A B
0 0.030626 0.494912 0.364742 0.320088
1 0.178368 0.857469 0.628677 0.705226
2 0.886296 0.833130 0.495135 0.246427
3 0.391352 0.128498 0.162211 0.011254
Wie kann ich die Spalten '1' und '2' in 'Eins' und 'Zwei' umbenennen?
Ich dachte, df.rename () hätte geholfen, aber das tut es nicht. Hast du keine Ahnung, wie das geht?
Das ist in der Tat etwas, das in rename
fehlt (im Idealfall sollten Sie die Stufe angeben können).
Eine andere Möglichkeit besteht darin, die Ebenen des Spaltenindex festzulegen. Dann müssen Sie jedoch alle Werte für diese Ebene kennen:
In [41]: df.columns.levels[0]
Out[41]: Index([u'1', u'2'], dtype='object')
In [43]: df.columns = df.columns.set_levels(['one', 'two'], level=0)
In [44]: df
Out[44]:
one two
A B A B
0 0.899686 0.466577 0.867268 0.064329
1 0.162480 0.455039 0.736870 0.759595
2 0.620960 0.922119 0.060141 0.669997
3 0.871107 0.043799 0.080080 0.577421
In [45]: df.columns.levels[0]
Out[45]: Index([u'one', u'two'], dtype='object')
Benutze set_levels
:
>>> df.columns.set_levels(['one','two'], 0, inplace=True)
>>> print(df)
one two
A B A B
0 0.731851 0.489611 0.636441 0.774818
1 0.996034 0.298914 0.377097 0.404644
2 0.217106 0.808459 0.588594 0.009408
3 0.851270 0.799914 0.328863 0.009914
df.columns.set_levels(['one', 'two'], level=0, inplace=True)
df.rename_axis({'1':'one', '2':'two'}, axis='columns', inplace=True)
Das ist eine gute Frage. Wenn Sie die Antwort oben kombinieren, können Sie eine Funktion schreiben:
def rename_col( df, columns, level = 0 ):
def rename_apply ( x, rename_dict ):
try:
return rename_dict[x]
except KeyError:
return x
if isinstance(df.columns, pd.core.index.MultiIndex):
df.columns = df.columns.set_levels([rename_apply(x, rename_dict = columns ) for x in df.columns.levels[level]], level= level)
else:
df.columns = [rename_apply(x, rename_dict = columns ) for x in df.columns ]
return df
Es hat bei mir funktioniert.
Idealerweise sollte eine solche Funktionalität in Zukunft in die "offizielle" "Umbenennungs" -Funktion integriert werden, damit Sie keinen solchen Hack schreiben müssen.
Ab pandas 0.22.0 (und wahrscheinlich viel früher) können Sie die Stufe angeben:
df = df.rename(columns={'1': one, '2': two}, level=0)
oder alternativ (neue Notation seit pandas 0.21.0):
df = df.rename({'1': one, '2': two}, axis='columns', level=0)
Aber eigentlich funktioniert es sogar, wenn man das Level weglässt:
df = df.rename(columns={'1': one, '2': two})
In diesem Fall werden alle Spaltenebenen auf Vorkommen überprüft, die umbenannt werden sollen.