Pandas 时间跨度和组:需要 groupby/pivot 将索引作为组 ID,并使用与最近期间值相对应的列

Pandas timespan and groups: Need to groupby/pivot with index as group id with columns that correspond to most recent period values

我有一个 table 看起来像这样:

   Index Group_Id   Period Start    Period End  Value   Value_Count
    42   1016833    2012-01-01   2013-01-01     127491.00     17.0
    43   1016833    2013-01-01   2014-01-01     48289.00      9.0
    44   1016833    2014-01-01   2015-01-01     2048.00       2.0
    45   1016926    2012-02-01   2013-02-01     913.00        1.0
    46   1016926    2013-02-01   2014-02-01     6084.00       5.0
    47   1016926    2014-02-01   2015-02-01     29942.00      3.0
    48   1016971    2014-03-01   2015-03-01     0.00          0.0

我试图得到一个 'wide' df,其中每个 Group_Id 都有一个观察值,并且 value/value 计数被转换为与其各自周期对应的列,顺序为最近。所以最终的结果是:

   Index Group_Id   Value_P0    Value_P1    Value_P3    Count_P0    Count_P1 ... 
    42   1016833    2048.00      48289.00   127491.00     2.0         9.0   
    45   1016926    29942.00     6084.00    913.00        3.0         5.0
    48   1016971    0.0          0.00       0.0           0.0         0.0

其中 Value_P0 是最近的值,Value_P1 是下一个最近的值,Count 列的工作方式相同。

我试过旋转 table,以便 Group_IDs 是索引,Period Start 是列,Values 或 Counts 是相应的值。

Period Start    2006-07-01  2008-07-01  2009-02-01  2009-12-17  2010-02-01  2010-06-01  2010-07-01  2010-08-13  2010-09-01  2010-12-01  ... 2016-10-02  2016-10-20  2016-12-29  2017-01-05  2017-02-01  2017-03-28  2017-04-10  2017-05-14  2017-08-27  2017-09-15
Group_Id                                                                                    
1007310 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1007318 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1007353 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...

通过这种方式,我将 Group_Ids 作为一条记录,但随后需要遍历许多列的每一行并提取非 NaN 值。他们的顺序将对应于从旧到新。不过,这似乎是一种不正确的方法。

我还考虑过按 Group_Id 分组并以某种方式创建与最近日期相对应的时间增量。然后从这个 pivoting/unstacking 中,列是 timedelta,值是 value 或 value_count。不过,我不确定该怎么做。感谢您的帮助。

仍在使用 pivot

df['ID']=df.groupby('Group_Id').cumcount()
d1=df.pivot('Group_Id','ID','Value').add_prefix('Value_P')
d2=df.pivot('Group_Id','ID','Value_Count').add_prefix('Count_P')
pd.concat([d1,d2],axis=1).fillna(0)

Out[347]: 
ID        Value_P0  Value_P1  Value_P2  Count_P0  Count_P1  Count_P2
Group_Id                                                            
1016833   127491.0   48289.0    2048.0      17.0       9.0       2.0
1016926      913.0    6084.0   29942.0       1.0       5.0       3.0
1016971        0.0       0.0       0.0       0.0       0.0       0.0