Estoy trabajando con algunos DataFrames. Uno de ellos tiene algunas columnas agregadas y algunas columnas eliminadas. La primera columna de ambos es una columna de fecha, y df2 continúa donde quedó df1, cronológicamente.

df1:
day     alice  bob
8/11    0      0
8/25    2      5
9/1     2      0

df2:
day     alice  charlie
9/12    1      1
9/25    2      3
9/1     2      1

Me gustaría combinarlos, para obtener un DataFrame con todas las fechas y todas las columnas presentes.

df3: 
day     alice  bob  charlie
8/11    0      0      0 
8/25    2      5      0 
9/1     2      0      0
9/12    1      0      1
9/25    2      0      3
9/1     2      0      1

Cuando combino mis 2 DataFrames reales con pd.concat o pd append, aparece el siguiente error:

AssertionError: Number of manager items must equal union of block items
# manager items: 65, # tot_items: 66

No estoy seguro de cuál podría ser el problema. Mientras tanto, gracias y eres increíble. Puedo proporcionarle un ejemplo más detallado si es necesario.

1
VP9 7 may. 2020 a las 06:57

4 respuestas

La mejor respuesta

La solución es correcta:

df = pd.concat([df1,df2]).fillna(0)

Pero aquí hay un error:

AssertionError: el número de elementos del administrador debe ser igual a la unión de los elementos del bloque # elementos del administrador: 65, # tot_items: 66

Significa que hay nombres de columnas duplicados, puede verificarlo:

print (df1.loc[:, df1.columns.duplicated(keep=False)])
print (df2.loc[:, df2.columns.duplicated(keep=False)])

Si los mismos valores en las columnas son posibles, elimine los duplicados por:

df1 = df1.loc[:, ~df1.columns.duplicated()]
df2 = df2.loc[:, ~df2.columns.duplicated()]
df = pd.concat([df1,df2]).fillna(0)
1
jezrael 7 may. 2020 a las 04:43
df1['charlie']=0
df2['bob']=0
df=pd.concat([df1,df2]).reset_index().drop(['index'],axis=1)

Explicación: puede agregar las columnas que faltan en los respectivos marcos de datos. Ahora, si concat (), no se generará ningún error.

0
Mehul Gupta 7 may. 2020 a las 04:09

Para obtener un DataFrame con todas las fechas y columnas presentes, puede usar DataFrame.combine_first.

import pandas as pd
import numpy as np

# Create df1
df1 = pd.DataFrame({
    'day': ['8/11', '8/25', '9/1'],
    'alice': [0, 2, 2],
    'bob': [0, 5, 0]
}).set_index('day')

# Create df2
df2 = pd.DataFrame({
    'day': ['9/12', '9/25', '9/1'],
    'alice': [1, 2, 2],
    'charlie': [1, 3, 1]
}).set_index('day')

# Do combine_first
df = df2.combine_first(df1).fillna(0)

Marcos de datos iniciales

Df1

      alice  bob
day             
8/11      0    0
8/25      2    5
9/1       2    0

Df2

      alice  charlie
day                 
9/12      1        1
9/25      2        3
9/1       2        1

Marco de datos final df

      alice  bob  charlie
day                      
8/11    0.0  0.0      0.0
8/25    2.0  5.0      0.0
9/1     2.0  0.0      1.0
9/12    1.0  0.0      1.0
9/25    2.0  0.0      3.0
0
santhisenan 7 may. 2020 a las 04:26

Creo que esto funcionará:

df3 = pd.concat([df1.set_index("day"), df2.set_index("day")]).fillna(value=0).reset_index()
0
Igor Rivin 7 may. 2020 a las 04:04