根据Pandas中第二列的条件,用另一行的同一列的值填充特定行的列中的值

时间:2019-05-13 20:36:32

标签: python pandas dataframe

我有一个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']

需要一些帮助。

1 个答案:

答案 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()将查看前几行以填充空值。