J'essaie de fusionner plusieurs dataframes avec des opérations de fusion consécutives, je souhaite ajouter un suffixe au nom des noms de colonnes nouvellement fusionnés. Une version simplifiée de mon code ressemble à ceci :
from pandas import *
f0 = DataFrame(columns=['data'], data=[1,2,3], index=['a','b','c'])
f1 = DataFrame(columns=['data'], data=[4,5,6], index=['c','b','a'])
f2 = DataFrame(columns=['data'], data=[7,8,9], index=['a','c','b'])
merged = f0
merged = merged.merge(f1, left_index=True, right_index=True, suffixes=("_0", "_1"))
merged = merged.merge(f2, left_index=True, right_index=True, suffixes=("", "_2"))
print merged.columns
Avec les pandas 0.15.2 sur python 2.7, cela renvoie :
Index([u'data_0', u'data_1', u'data'], dtype='object')
alors que je me serais attendu
Index([u'data_0', u'data_1', u'data_2'], dtype='object')
semble que tu veux juste ça?
In [45]: pd.concat([f0,f1,f2],axis=1,ignore_index=True)
Out[45]:
0 1 2
a 1 6 7
b 2 5 9
c 3 4 8
les suffixes ne s'appliquent que s'il y a des colonnes en double qui, après la première fusion, il n'y en a pas (par rapport à la 3e)
In [46]: merged1 = merged.merge(f1, left_index=True, right_index=True, suffixes=("_0", "_1"))
In [47]: merged1
Out[47]:
data_0 data_1
c 3 4
b 2 5
a 1 6
In [48]: merged1.merge(f2, left_index=True, right_index=True, suffixes=("", "_2"))
Out[48]:
data_0 data_1 data
a 1 6 7
c 3 4 8
b 2 5 9
Ah merci pour l'explication, j'ai raté le fait que les suffixes ne s'appliquent qu'aux noms de colonnes en double. Et effectivement la solution concat est plus simple. Et pour mémoire : concat(... ignore_index=True) est exactement le contraire de ce que je veux, mais avec concat(... ignore_index=False) ça marche bien.
super
gardez à l'esprit que vous ne voulez généralement pas avoir de colonnes en double
vous voudrez peut-être un résultat à plusieurs niveaux - utilisez l'argument keys pour concaténer
Commentaire le plus utile
semble que tu veux juste ça?
les suffixes ne s'appliquent que s'il y a des colonnes en double qui, après la première fusion, il n'y en a pas (par rapport à la 3e)