{"action":"opened","issue":{"url":"https://api.github.com/repos/pydata/pandas/issues/9854","labels_url":"https://api.github.com/repos/pydata/pandas/issues/9854/labels{/name}","comments_url":"https://api.github.com/repos/pydata/pandas/issues/9854/comments","events_url":"https://api.github.com/repos/pydata/pandas/issues/9854/events","html_url":"https://github.com/pydata/pandas/issues/9854","id":67806709,"number":9854,"title":"asfreq drops the name of the index","user":{"login":"amelio-vazquez-reina","id":1993919,"avatar_url":"https://avatars.githubusercontent.com/u/1993919?v=3","gravatar_id":"","url":"https://api.github.com/users/amelio-vazquez-reina","html_url":"https://github.com/amelio-vazquez-reina","followers_url":"https://api.github.com/users/amelio-vazquez-reina/followers","following_url":"https://api.github.com/users/amelio-vazquez-reina/following{/other_user}","gists_url":"https://api.github.com/users/amelio-vazquez-reina/gists{/gist_id}","starred_url":"https://api.github.com/users/amelio-vazquez-reina/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/amelio-vazquez-reina/subscriptions","organizations_url":"https://api.github.com/users/amelio-vazquez-reina/orgs","repos_url":"https://api.github.com/users/amelio-vazquez-reina/repos","events_url":"https://api.github.com/users/amelio-vazquez-reina/events{/privacy}","received_events_url":"https://api.github.com/users/amelio-vazquez-reina/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":0,"created_at":"2015-04-11T16:50:54Z","updated_at":"2015-04-11T16:50:54Z","closed_at":null,"body":"Originally reported on StackOverflow [here](http://stackoverflow.com/questions/29356412/efficiently-re-indexing-one-level-with-forward-fill-in-a-multi-index-dataframe/29404203?noredirect=1#comment47161025_29404203). \r\n\r\nThe question was asking how to efficiently re-index one level of a multi-index DataFrame with “forward-fill”. Andy's answer said:\r\n\r\n> You have a couple of options, the easiest IMO is to simply unstack the first level and then ffill. I think this make it much clearer about what's going on than a groupby/resample solution (I suspect it will also be faster, depending on the data):\r\n\r\n    In [11]: df1['value'].unstack(0)\r\n    Out[11]:\r\n    item_uid    0F01ddgkRa  0F02BZeTr6  0F02BcIzNo  0F02F4gAMs  0F02Vwd6Ou  0F04OlAs0R  0F05GInfPa  0F05PQARFJ  0F06LFhBCK  0F06ryso80  0F07gg7Oth  0S0099v8iI\r\n    created_at\r\n    2015-03-16         NaN         NaN         NaN         NaN         NaN         NaN      664.68         NaN         NaN       13.73         NaN         NaN\r\n    2015-03-17         NaN         NaN        1230         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN\r\n    2015-03-18         NaN         NaN         NaN         NaN         NaN      321.44         NaN     1074.31      211.49         NaN         NaN         NaN\r\n    2015-03-19         NaN         NaN         NaN         NaN     5709.33         NaN         NaN         NaN         NaN         NaN      2325.7         NaN\r\n    2015-03-20         NaN    51505.22         NaN         NaN         NaN         NaN         NaN         NaN         NaN       12.00         NaN         NaN\r\n    2015-03-23         NaN    51837.97        1130         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN\r\n    2015-03-24         NaN    51578.63         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN\r\n    2015-03-25     1414.71         NaN         NaN     1855.96         NaN         NaN         NaN         NaN         NaN         NaN         NaN    10652.79\r\n    2015-03-26         NaN         NaN         NaN         NaN         NaN         NaN         NaN     1098.31         NaN         NaN         NaN         NaN\r\n    2015-03-27         NaN    50893.42         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN\r\n\r\n> If you're missing some dates you have to reindex (assuming the start and end are present, otherwise you can do this manually e.g. with `pd.date_range`):\r\n\r\n    In [12]: df1['value'].unstack(0).asfreq('D')\r\n    Out[12]:\r\n    item_uid    0F01ddgkRa  0F02BZeTr6  0F02BcIzNo  0F02F4gAMs  0F02Vwd6Ou  0F04OlAs0R  0F05GInfPa  0F05PQARFJ  0F06LFhBCK  0F06ryso80  0F07gg7Oth  0S0099v8iI\r\n    2015-03-16         NaN         NaN         NaN         NaN         NaN         NaN      664.68         NaN         NaN       13.73         NaN         NaN\r\n    2015-03-17         NaN         NaN        1230         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN\r\n    2015-03-18         NaN         NaN         NaN         NaN         NaN      321.44         NaN     1074.31      211.49         NaN         NaN         NaN\r\n    2015-03-19         NaN         NaN         NaN         NaN     5709.33         NaN         NaN         NaN         NaN         NaN      2325.7         NaN\r\n    2015-03-20         NaN    51505.22         NaN         NaN         NaN         NaN         NaN         NaN         NaN       12.00         NaN         NaN\r\n    2015-03-21         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN\r\n    2015-03-22         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN\r\n    2015-03-23         NaN    51837.97        1130         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN\r\n    2015-03-24         NaN    51578.63         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN\r\n    2015-03-25     1414.71         NaN         NaN     1855.96         NaN         NaN         NaN         NaN         NaN         NaN         NaN    10652.79\r\n    2015-03-26         NaN         NaN         NaN         NaN         NaN         NaN         NaN     1098.31         NaN         NaN         NaN         NaN\r\n    2015-03-27         NaN    50893.42         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN\r\n\r\n**Note: `asfreq` drops the name of the index (which is most likely a bug!)**\r\n\r\nNow you can ffill:\r\n\r\n    In [13]: df1['value'].unstack(0).asfreq('D').ffill()\r\n    Out[13]:\r\n    item_uid    0F01ddgkRa  0F02BZeTr6  0F02BcIzNo  0F02F4gAMs  0F02Vwd6Ou  0F04OlAs0R  0F05GInfPa  0F05PQARFJ  0F06LFhBCK  0F06ryso80  0F07gg7Oth  0S0099v8iI\r\n    2015-03-16         NaN         NaN         NaN         NaN         NaN         NaN      664.68         NaN         NaN       13.73         NaN         NaN\r\n    2015-03-17         NaN         NaN        1230         NaN         NaN         NaN      664.68         NaN         NaN       13.73         NaN         NaN\r\n    2015-03-18         NaN         NaN        1230         NaN         NaN      321.44      664.68     1074.31      211.49       13.73         NaN         NaN\r\n    2015-03-19         NaN         NaN        1230         NaN     5709.33      321.44      664.68     1074.31      211.49       13.73      2325.7         NaN\r\n    2015-03-20         NaN    51505.22        1230         NaN     5709.33      321.44      664.68     1074.31      211.49       12.00      2325.7         NaN\r\n    2015-03-21         NaN    51505.22        1230         NaN     5709.33      321.44      664.68     1074.31      211.49       12.00      2325.7         NaN\r\n    2015-03-22         NaN    51505.22        1230         NaN     5709.33      321.44      664.68     1074.31      211.49       12.00      2325.7         NaN\r\n    2015-03-23         NaN    51837.97        1130         NaN     5709.33      321.44      664.68     1074.31      211.49       12.00      2325.7         NaN\r\n    2015-03-24         NaN    51578.63        1130         NaN     5709.33      321.44      664.68     1074.31      211.49       12.00      2325.7         NaN\r\n    2015-03-25     1414.71    51578.63        1130     1855.96     5709.33      321.44      664.68     1074.31      211.49       12.00      2325.7    10652.79\r\n    2015-03-26     1414.71    51578.63        1130     1855.96     5709.33      321.44      664.68     1098.31      211.49       12.00      2325.7    10652.79\r\n    2015-03-27     1414.71    50893.42        1130     1855.96     5709.33      321.44      664.68     1098.31      211.49       12.00      2325.7    10652.79\r\n\r\nand stack it back (Note: you can dropna=False if you want to include the starting NaN):\r\n\r\n    In [14]: s = df1['value'].unstack(0).asfreq('D').ffill().stack()\r\n\r\nNote: If you the ordering of the index is important you can switch/sort it:\r\n\r\n    In [15]: s.index = s.index.swaplevel(0, 1)\r\n\r\n    In [16]: s = s.sort_index()\r\n\r\n    In [17]: s.index.names = ['item_uid', 'created_at']  # as this is lost earlier\r\n\r\n    In [18]: s\r\n    Out[18]:\r\n    item_uid\r\n    0F01ddgkRa  2015-03-25     1414.71\r\n                2015-03-26     1414.71\r\n                2015-03-27     1414.71\r\n    0F02BZeTr6  2015-03-20    51505.22\r\n                2015-03-21    51505.22\r\n                2015-03-22    51505.22\r\n                2015-03-23    51837.97\r\n                2015-03-24    51578.63\r\n                2015-03-25    51578.63\r\n                2015-03-26    51578.63\r\n                2015-03-27    50893.42\r\n    ...\r\n    0S0099v8iI  2015-03-25    10652.79\r\n                2015-03-26    10652.79\r\n                2015-03-27    10652.79\r\n    Length: 100, dtype: float64\r\n\r\nWhether this is more efficient than a groupby/resample apply solution will depend on the data. For very sparse data (with lots of starting up NaN, assuming you want to drop these) I suspect it won't be as fast. If the data is dense (or you want to keep the initial NaN) I suspect this solution should be faster.\r\n\r\n    In [12]: df1['value'].unstack(0).asfreq('D')\r\n    Out[12]:\r\n    item_uid    0F01ddgkRa  0F02BZeTr6  0F02BcIzNo  0F02F4gAMs  0F02Vwd6Ou  0F04OlAs0R  0F05GInfPa  0F05PQARFJ  0F06LFhBCK  0F06ryso80  0F07gg7Oth  0S0099v8iI\r\n    2015-03-16         NaN         NaN         NaN         NaN         NaN         NaN      664.68         NaN         NaN       13.73         NaN         NaN\r\n    2015-03-17         NaN         NaN        1230         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN\r\n    2015-03-18         NaN         NaN         NaN         NaN         NaN      321.44         NaN     1074.31      211.49         NaN         NaN         NaN\r\n    2015-03-19         NaN         NaN         NaN         NaN     5709.33         NaN         NaN         NaN         NaN         NaN      2325.7         NaN\r\n    2015-03-20         NaN    51505.22         NaN         NaN         NaN         NaN         NaN         NaN         NaN       12.00         NaN         NaN\r\n    2015-03-21         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN\r\n    2015-03-22         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN\r\n    2015-03-23         NaN    51837.97        1130         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN\r\n    2015-03-24         NaN    51578.63         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN\r\n    2015-03-25     1414.71         NaN         NaN     1855.96         NaN         NaN         NaN         NaN         NaN         NaN         NaN    10652.79\r\n    2015-03-26         NaN         NaN         NaN         NaN         NaN         NaN         NaN     1098.31         NaN         NaN         NaN         NaN\r\n    2015-03-27         NaN    50893.42         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN\r\n\r\n*Note: `asfreq` drops the name of the index (which is most likely a bug!)*\r\n"}}