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?
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')
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
df.columns.set_levels(['one', 'two'], level=0, inplace=True)
df.rename_axis({'1':'one', '2':'two'}, axis='columns', inplace=True)
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.
À 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.