wake-up-neo.net

python pandas: Benennen Sie eine einzelne Spaltenbezeichnung in einem Datenrahmen mit mehreren Indizes um

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?

12
Boosted_d16

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')
20
joris

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
4
TheBlackCat
df.columns.set_levels(['one', 'two'], level=0, inplace=True)
3

df.rename_axis({'1':'one', '2':'two'}, axis='columns', inplace=True)

2
amn34

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.

0
Ying Zhang

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.

0
kadee