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
我有一个 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