Skip to main content
 首页 » 编程设计

python之扩展面板中每个组的时间序列

2025年05月04日19powertoolsteam

我有以下数据库:

firm    sic     identifier  name                    year    X           Y           Z 
1078    2834.0  002824100   ABBOTT LABORATORIES     2013    4.347826    5.217391    15.739130    
1078    2834.0  002824100   ABBOTT LABORATORIES     2014    4.368421    6.263158    16.684211    
112178  2836.0  00339B107   ABGENIX INC             2005    5.222222    3.111111    9.777778     
112178  2836.0  00339B107   ABGENIX INC             2006    5.222222    4.111111    10.777778      
178855  2836.0  00383Y102   ABRAXIS BIOSCIENCE INC  2007    4.000000    0.000000    13.544322    

我的意图是将每个组的年份变量向后延长 5 年。公司、原文、标识符和名称列将需要复制到新行。但是,X、Y 和 Z 列将为 NAN。

预期结果:

firm    sic     identifier  name                    year    X           Y           Z 
1078    2834.0  002824100   ABBOTT LABORATORIES     2008    NAN         NAN         NAN 
1078    2834.0  002824100   ABBOTT LABORATORIES     2009    NAN         NAN         NAN 
1078    2834.0  002824100   ABBOTT LABORATORIES     2010    NAN         NAN         NAN   
1078    2834.0  002824100   ABBOTT LABORATORIES     2011    NAN         NAN         NAN 
1078    2834.0  002824100   ABBOTT LABORATORIES     2012    NAN         NAN         NAN 
1078    2834.0  002824100   ABBOTT LABORATORIES     2013    4.347826    5.217391    15.739130    
1078    2834.0  002824100   ABBOTT LABORATORIES     2014    4.368421    6.263158    16.684211    
112178  2836.0  00339B107   ABGENIX INC             2000    NAN         NAN         NAN  
112178  2836.0  00339B107   ABGENIX INC             2001    NAN         NAN         NAN 
112178  2836.0  00339B107   ABGENIX INC             2002    NAN         NAN         NAN  
112178  2836.0  00339B107   ABGENIX INC             2003    NAN         NAN         NAN  
112178  2836.0  00339B107   ABGENIX INC             2004    NAN         NAN         NAN  
112178  2836.0  00339B107   ABGENIX INC             2005    4.454545    3.181818    11.000000 
112178  2836.0  00339B107   ABGENIX INC             2006    4.222222    4.000000    13.555556 
178855  2836.0  00383Y102   ABRAXIS BIOSCIENCE INC  2007    NAN         NAN         NAN  
178855  2836.0  00383Y102   ABRAXIS BIOSCIENCE INC  2007    NAN         NAN         NAN          
178855  2836.0  00383Y102   ABRAXIS BIOSCIENCE INC  2007    NAN         NAN         NAN  
178855  2836.0  00383Y102   ABRAXIS BIOSCIENCE INC  2007    NAN         NAN         NAN          
178855  2836.0  00383Y102   ABRAXIS BIOSCIENCE INC  2007    NAN         NAN         NAN      
178855  2836.0  00383Y102   ABRAXIS BIOSCIENCE INC  2007    4.000000    0.000000    13.544322        

如果您对如何在 python 中实现它有一些想法,请与我分享。

提前致谢。

请您参考如下方法:

您可以使用index.repeat 和merge

f = df.groupby('firm').first() 
d = f.loc[f.index.repeat(5)] 
 
d.assign(year=d.year+np.tile(np.arange(-5, 0), len(f)), 
           X=np.nan, 
           Y=np.nan, 
           Z=np.nan)\ 
 .merge(df.set_index('firm'), how='outer')\ 
 .sort_values(['identifier', 'year']) 

      sic identifier                    name  year         X         Y          Z 
0   2834.0  002824100     ABBOTT LABORATORIES  2008       NaN       NaN        NaN 
1   2834.0  002824100     ABBOTT LABORATORIES  2009       NaN       NaN        NaN 
2   2834.0  002824100     ABBOTT LABORATORIES  2010       NaN       NaN        NaN 
3   2834.0  002824100     ABBOTT LABORATORIES  2011       NaN       NaN        NaN 
4   2834.0  002824100     ABBOTT LABORATORIES  2012       NaN       NaN        NaN 
15  2834.0  002824100     ABBOTT LABORATORIES  2013  4.347826  5.217391  15.739130 
16  2834.0  002824100     ABBOTT LABORATORIES  2014  4.368421  6.263158  16.684211 
5   2836.0  00339B107             ABGENIX INC  2000       NaN       NaN        NaN 
6   2836.0  00339B107             ABGENIX INC  2001       NaN       NaN        NaN 
7   2836.0  00339B107             ABGENIX INC  2002       NaN       NaN        NaN 
8   2836.0  00339B107             ABGENIX INC  2003       NaN       NaN        NaN 
9   2836.0  00339B107             ABGENIX INC  2004       NaN       NaN        NaN 
17  2836.0  00339B107             ABGENIX INC  2005  5.222222  3.111111   9.777778 
18  2836.0  00339B107             ABGENIX INC  2006  5.222222  4.111111  10.777778 
10  2836.0  00383Y102  ABRAXIS BIOSCIENCE INC  2002       NaN       NaN        NaN 
11  2836.0  00383Y102  ABRAXIS BIOSCIENCE INC  2003       NaN       NaN        NaN 
12  2836.0  00383Y102  ABRAXIS BIOSCIENCE INC  2004       NaN       NaN        NaN 
13  2836.0  00383Y102  ABRAXIS BIOSCIENCE INC  2005       NaN       NaN        NaN 
14  2836.0  00383Y102  ABRAXIS BIOSCIENCE INC  2006       NaN       NaN        NaN 
19  2836.0  00383Y102  ABRAXIS BIOSCIENCE INC  2007  4.000000  0.000000  13.544322