如何使用Pandas面板中最近年份的值来填充缺失值?

时间:2019-02-02 01:55:14

标签: python pandas

对于下面的示例,我要使用1994的值。SIC通常在所有年份中都是相同的。在极少数情况下,时间可能会有所不同。我有25万个观测值的大面板。谢谢!

Group Num   Date    SIC
100783  1994-03-28  2621
100783  1995-03-30  NaN
100783  1996-03-28  2621
100783  1997-03-27  2621
100783  1998-03-31  2621
842635  1994-03-17  2911
842635  1995-03-30  NaN
842635  1996-03-20  2911
842635  1997-03-21  2911
842635  1998-03-31  2911

1 个答案:

答案 0 :(得分:1)

对于Wen-Ben在评论中给出的答案,我将进行扩展并提供更多指导。

首先,要实现此目的,您需要一个基于Group NumDate变量的有序DataFrame。如果您确定已经订购了DataFrame,则无需执行以下命令,否则确实需要排序(在原位执行):

df.sort_values(['Group Num', 'Date'], inplace=True)

在订购DataFrame之后,可以基于变量'Group Num'的分组,要求使用最接近的先前值来估算SIC(因此,最接近的先前值将仅从其引用组中获取):< / p>

df['SIC'] = df.groupby('Group Num')['SIC'].ffill()

ffill命令(https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.ffill.html)会将最后一个有效观察向前传播到下一个有效观察。因此,如果有任何一个以缺失值开头的组,则不会进行插补。给定大文件,您最好再使用bfill(https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.bfill.html)启动另一个插补,它使用下一个有效观察值来填补任何空白:

df['SIC'] = df.groupby('Group Num')['SIC'].bfill()

这足以覆盖所有丢失的事件,并且替换操作无需创建新的DataFrame,而是在现有的DataFrame的列上进行。