1

我有一个看起来像这样的表:

   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

我试图以“宽” df 结尾,其中每个 Group_Id 都有一个观察值,并且值/值计数按新近度的顺序转换为与它们各自时期相对应的列。所以最终的结果是这样的:

   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 列的工作方式相同。

我尝试旋转表格,使 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 进行分组,并以某种方式创建与最近日期相对应的 timedelta。然后从此旋转/取消堆叠,以便列是 timedelta,值是 value 或 value_count。我不确定如何做到这一点。我很感激帮助。

4

1 回答 1

0

仍在使用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
于 2017-10-31T17:22:47.167 回答