您不清楚确切的失踪日期。我只是假设您要填写
NaN在其他地方 确实 有观察到的任何日期。如果此假设有误,则必须修改我的解决方案。
旁注:添加一行以创建
Dataframe
In [55]: df = pd.Dataframe({'A': ['loc_a'] * 12 + ['loc_b'], ....: 'B': ['group_a'] * 7 + ['group_b'] * 3 + ['group_c'] * 2 + ['group_a'], ....: 'Date': ["2013-06-11", ....: "2013-07-02", ....: "2013-07-09", ....: "2013-07-30", ....: "2013-08-06", ....: "2013-09-03", ....: "2013-10-01", ....: "2013-07-09", ....: "2013-08-06", ....: "2013-09-03", ....: "2013-07-09", ....: "2013-09-03", ....: "2013-10-01"], ....: 'Value': [22, 35, 14, 9, 4, 40, 18, 4, 2, 5, 1, 2, 3]})In [56]:In [56]: df.Date = pd.to_datetime(df.Date)In [57]: df = df.set_index(['A', 'B', 'Date'])In [58]:In [58]: print(df) ValueA B Date loc_a group_a 2013-06-11 22 2013-07-02 35 2013-07-09 14 2013-07-30 9 2013-08-06 4 2013-09-03 40 2013-10-01 18 group_b 2013-07-09 4 2013-08-06 2 2013-09-03 5 group_c 2013-07-09 1 2013-09-03 2loc_b group_a 2013-10-01 3
要填充未观察到的值,我们将使用
unstack和
stack方法。取消堆叠将创建
NaN我们感兴趣的s,然后将它们堆叠起来使用。
In [71]: df.unstack(['A', 'B'])Out[71]: Value A loc_aloc_bBgroup_a group_b group_c group_aDate 2013-06-11 22 NaN NaN NaN2013-07-02 35 NaN NaN NaN2013-07-09 14 4 1 NaN2013-07-30 9 NaN NaN NaN2013-08-06 4 2 NaN NaN2013-09-03 40 5 2 NaN2013-10-01 18 NaN NaN 3In [59]: df.unstack(['A', 'B']).fillna(0).stack(['A', 'B'])Out[59]: ValueDate A B 2013-06-11 loc_a group_a 22 group_b 0 group_c 0loc_b group_a 02013-07-02 loc_a group_a 35 group_b 0 group_c 0loc_b group_a 02013-07-09 loc_a group_a 14 group_b 4 group_c 1loc_b group_a 02013-07-30 loc_a group_a 9 group_b 0 group_c 0loc_b group_a 02013-08-06 loc_a group_a 4 group_b 2 group_c 0loc_b group_a 02013-09-03 loc_a group_a 40 group_b 5 group_c 2loc_b group_a 02013-10-01 loc_a group_a 18 group_b 0 group_c 0loc_b group_a 3
根据需要重新排列索引级别。
我必须将其滑到
fillna(0)中间,以免
NaNs掉落。
stack确实有一个
dropna论点。我认为将其设置为false将保留所有
NaN行。可能是个错误?
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)