Tengo dos marcos de datos de las mismas ID con estructura idéntica:

X, Y, Value, ID

La única diferencia entre los dos debería ser los valores en la columna Valor: es posible que primero deba ordenarse por ID para que ambos tengan el mismo orden de filas para asegurarse.

Quiero comparar estos dos marcos de datos por fila en función del valor de la columna y mantener la fila del primero o segundo dependiendo de dónde sea mayor el valor. También me gustaría ver un ejemplo de cómo agregar una columna SUMA adicional para la suma de columnas Value de ambos marcos de datos.

Me alegrará por cualquier ejemplo, incluido el uso de numpy si cree que es mejor usarlo que Pandas.

Editar: Acabo de darme cuenta después de probar el ejemplo de la primera respuesta que los marcos de datos que tengo faltan por completo en las filas con identificadores donde el valor era nulo. Eso hace dos marcos de datos de diferente número de filas. Entonces, ¿podría incluirse también cómo hacerlos del mismo tamaño antes de la comparación, agregando filas con identificadores faltantes entre sí con ID y ceros?

2
Miro 11 dic. 2015 a las 05:39

3 respuestas

La mejor respuesta
df = (pd.concat([df1, df2])
      .groupby(['ID','X','Y'])
      .agg({'value':'max', 'value_sum':'sum'}))
1
attitude_stool 11 dic. 2015 a las 04:27

Utilizo reindex_like para alinear marcos de datos y luego where y loc para llenar la columna { {X3}} del nuevo marco de datos df:

print df1
   X  Y  Value  ID
0  1  4     10   0
1  2  5     55   1
2  3  6     21   2

print df2
   X  Y  Value  ID
0  2  5      7   1
1  3  6     34   2
#align dataframes
df1 = df1.set_index('ID')
df2 = df2.set_index('ID')
df2 = df2.reindex_like(df1)
print df2
     X   Y  Value
ID               
0  NaN NaN    NaN
1    2   5      7
2    3   6     34
#create new df
df = df1.copy()
df['Value'] = df1['Value'].where(df1['Value'] > df2['Value'], df2['Value'])
#if value is NaN in column df2 give value of column1
df.loc[df2['Value'].isnull(), 'Value'] = df1['Value']
print df
    X  Y  Value
ID             
0   1  4     10
1   2  5     55
2   3  6     34
#sum columns Value to columns SUM 
df1['SUM'] = df1['Value'].sum()
df2['SUM'] = df2['Value'].sum()
print df1
    X  Y  Value  SUM
ID                  
0   1  4     10   86
1   2  5     55   86
2   3  6     21   86

#remove rows with NaN
print df2.dropna()
    X  Y  Value  SUM
ID                  
1   2  5      7   41
2   3  6     34   41
1
jezrael 11 dic. 2015 a las 06:39
import numpy as np

# create a new dataframe, where Value is the max value per row
val1 = df1['Value']
val2 = df2['Value'][val1.index]  # align to val1
df = df1.copy()
df['Value'] = np.maximum(val1, val2)

# add a SUM column:
df1['SUM'] = df1['Value'].sum()
df2['SUM'] = df2['Value'].sum()
2
shx2 11 dic. 2015 a las 03:11
34215260