Complete los valores en una columna de una fila en particular con el valor de la misma columna de otra fila según una condición en la segunda columna en Pandas

toma

Tengo un marco de datos que representa un conjunto de datos de la cadena minorista. Tiene columnas Item_Identifier, Item_Weight, Item_MRP, Outlet_Identifier. La columna Item_Weight, que representa el peso del artículo en particular en gramos, y es numérica, tiene ciertos valores faltantes. La columna Item_Weight tiene valores faltantes para los artículos donde la columna Outlet_Identifier = OUT019 o OUT027. Sin embargo, el mismo artículo (identificado por Item_Identifier) ​​en una fila diferente con otro Outlet_Identifier (que no sea OUT019 o OUT027) tiene Item_Weight presente y se puede usar para sustituir el Item_Weight faltante por Outlet_Identifier (OUT019 o OUT027).

He escrito el siguiente código pero parece tener un problema. Y laso no es la forma más limpia de hacer:

items = df_train[df_train.Outlet_Identifier == "OUT019"]['Item_Identifier']
listItems = []
for i in items:
    u = df_train.query('(Item_Identifier == @i) & (Outlet_Identifier != 
         "OUT019") & (Outlet_Identifier != "OUT027")').head(1)
    if not u.empty:
        listItems.append(u.at[u.index[0],'Item_Weight'])

df_rep = pd.concat([items.reset_index(),pd.DataFrame(listItems)],axis=1)
df_rep.columns = ['row', 'Item_Identifier', 'Item_Weight']
for index, row in df_rep.iterrows():
    df_train.loc[df_train.Item_Identifier == row.Item_Identifier ]
                                      ['Item_Weight']= row['Item_Weight']

Necesito ayuda.

reservado
df['Item_Weight'] = df.groupby(['Item_Identifier','Outlet_Identifier'])['Item_Weight'].ffill()
df['Item_Weight'] = df.groupby(['Item_Identifier','Outlet_Identifier'])['Item_Weight'].bfill()

Esto debería solucionar tu problema. El ffill()va a mirar todos los siguientes filas para ver si tiene algo disponible y se llenarlo y bfill()se verá en las filas anteriores para llenar los valores nulos.

Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.

En caso de infracción, por favor [email protected] Eliminar

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

TOP Lista

CalienteEtiquetas

Archivo