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

Python - fill NA by value from previous rows based on identifier column

我想在 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

因此,Date 列的 NaN 应根据 Cat1 列 - 01/09/18cat 值的最后存在日期进行填充。 Cat2 列中的 NaN 应由 mouse 填充为已为 Date - 01/09/18 选择的行中的定义值。

我读到循环遍历每一行是非常糟糕的做法,最好以一种方式完成所有事情。

我会很感激任何 idea.Thanks)

我尝试通过 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

我相信您需要 GroupBy.ffill with DataFrame.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

此外,替代方法是:

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

谢谢@Jezrael 的解决方案:)

你可以使用字典:

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

对于 timeseries-column,您可以使用 timedelta(线性外推)。祝你好运!