web-dev-qa-db-fra.com

pandas python: renommer l'étiquette d'une seule colonne dans un cadre de données à index multiples

J'ai un df qui ressemble à ceci:

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

Comment renommer les colonnes "1" et "2" en "Un" et "Deux"?

Je pensais que df.rename () aurait aidé mais ce n’est pas le cas. Vous ne savez pas comment faire cela?

12
Boosted_d16

C'est en effet quelque chose qui manque dans rename (idéalement, cela devrait vous permettre de spécifier le niveau).
Vous pouvez également définir les niveaux de l'index des colonnes, mais vous devez connaître toutes les valeurs de ce niveau:

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

Utilisez 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
Cristián Antuña

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

2
amn34

C'est une bonne question. En combinant la réponse ci-dessus, vous pouvez écrire une fonction:

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

Cela a fonctionné pour moi.

Idéalement, une fonctionnalité comme celle-ci devrait être intégrée à la fonction "officielle" de "changement de nom" dans le futur, vous n'avez donc pas besoin d'écrire un hack comme celui-ci.

0
Ying Zhang

À partir de pandas 0.22.0 (et probablement beaucoup plus tôt), vous pouvez spécifier le niveau:

df = df.rename(columns={'1': one, '2': two}, level=0)

ou bien (nouvelle notation depuis les pandas 0.21.0):

df = df.rename({'1': one, '2': two}, axis='columns', level=0)

Mais en réalité, cela fonctionne même en omettant le niveau:

df = df.rename(columns={'1': one, '2': two})

Dans ce cas, tous les niveaux de colonne sont vérifiés pour les occurrences à renommer.

0
kadee