Python-根据标识符列,按前几行的值填充NA

时间:2019-03-27 13:38:36

标签: python pandas dataframe fillna

我想在2列中填写缺失值。有Date和Cat2应该根据预定义的Cat1(在先前填充的行中预定义)的最后日期填充另一行的值,例如:

数据示例:

Day  Date      Cat1      Cat2
1    31/12/17  cat       mouse
2    01/09/18  cat       mouse
3    27/05/18  dog       elephant
4       NaN    cat       NaN
5       NaN    cat       NaN

因此,应基于NaN列-Datecat值的最后存在日期来填充Cat1列的01/09/18NaN列中的Cat2应该由mouse填充为已为Date-01/09/18选择的行中的定义值。

我读到,遍历每一行将是非常糟糕的做法,并且最好以一种方式完成所有操作。

任何想法我都会感激。谢谢

我尝试通过fillna方法执行此操作,但是它填充的是没有Cat1条件的最后一个值。

data.fillna(method='ffill', inplace = True)

实际结果是:

Day  Date      Cat1      Cat2
1    31/12/17  cat       mouse
2    01/09/18  cat       mouse
3    27/05/18  dog       elephant
4    27/05/18  cat       elephant
5    27/05/18  cat       elephant

预期结果应该是:

Day  Date      Cat1      Cat2
1    31/12/17  cat       mouse
2    01/09/18  cat       mouse
3    27/05/18  dog       elephant
4    01/09/18  cat       mouse
5    01/09/18  cat       mouse

3 个答案:

答案 0 :(得分:1)

我相信您需要GroupBy.ffillDataFrame.reindex来获得与原始DataFrame相同的订单:

df = df.groupby('Cat1').ffill().reindex(df.columns, axis=1)
print (df)
   Day      Date Cat1      Cat2
0    1  31/12/17  cat     mouse
1    2  01/09/18  cat     mouse
2    3  27/05/18  dog  elephant
3    4  01/09/18  cat     mouse
4    5  01/09/18  cat     mouse

答案 1 :(得分:0)

另外,另一种方法是:

data = data.groupby(['Cat1'], as_index = False).apply(lambda group: group.ffill())

谢谢@Jezrael提供解决方案:)

答案 2 :(得分:0)

您可以使用字典:

dict = df[['cat','cat2']].drop_duplicates(keep='first', inplace=False).to_dict()
df['cat2'] = df['cat1'].replace(dict)

对于时间序列列,可以使用timedelta(线性外推)。祝你好运!