Estoy tratando de fusionar varios marcos de datos con operaciones de fusión consecutivas, quiero agregar un sufijo al nombre de los nombres de las columnas recién fusionadas. Una versión simplificada de mi código se ve así:
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
Con pandas 0.15.2 en python 2.7, esto devuelve:
Index([u'data_0', u'data_1', u'data'], dtype='object')
mientras yo hubiera esperado
Index([u'data_0', u'data_1', u'data_2'], dtype='object')
parece que solo quieres esto?
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
los sufijos solo se aplican si hay columnas duplicadas que después de la primera combinación no las hay (en comparación con la tercera)
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, gracias por la explicación, me perdí el hecho de que los sufijos solo se aplican a los nombres de columna duplicados. Y, de hecho, la solución concat es más sencilla. Y para el registro: concat (... ignore_index = True) es exactamente lo contrario de lo que quiero, pero con concat (... ignore_index = False) funciona bien.
genial
tenga en cuenta que generalmente no desea tener columnas duplicadas
es posible que desee un resultado de varios niveles: use el argumento keys para concat
Comentario más útil
parece que solo quieres esto?
los sufijos solo se aplican si hay columnas duplicadas que después de la primera combinación no las hay (en comparación con la tercera)