我有一个Dataframe代表零售链数据集。它具有列Item_Identifier,Item_Weight,Item_MRP,Outlet_Identifier。 Item_Weight列代表特定项目的重量(以gms为单位),为数字,具有某些缺失值。列Outlet_Identifier = OUT019或OUT027的Item列的Item_Weight缺少值。但是,在不同行中具有另一个Outlet_Identifier(OUT019或OUT027除外)的同一行中的同一Item(由Item_Identifier标识)具有Item_Weight,可用于将缺少的Item_Weight替换为Outlet_Identifier(OUT019或OUT027)。
我编写了以下代码,但似乎有问题。而且,这不是最干净的方法:
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']
需要一些帮助。
答案 0 :(得分:1)
df['Item_Weight'] = df.groupby(['Item_Identifier','Outlet_Identifier'])['Item_Weight'].ffill()
df['Item_Weight'] = df.groupby(['Item_Identifier','Outlet_Identifier'])['Item_Weight'].bfill()
这应该可以解决您的问题。 ffill()
将查看所有下一行以查看是否有可用的内容并将其填充,而bfill()
将查看前几行以填充空值。