对于下面的示例,我要使用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
答案 0 :(得分:1)
对于Wen-Ben在评论中给出的答案,我将进行扩展并提供更多指导。
首先,要实现此目的,您需要一个基于Group Num
和Date
变量的有序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的列上进行。