id,node_id,number,title,user,state,locked,assignee,milestone,comments,created_at,updated_at,closed_at,author_association,active_lock_reason,draft,pull_request,body,reactions,performed_via_github_app,state_reason,repo,type 244016361,MDU6SXNzdWUyNDQwMTYzNjE=,1483,Loss of coordinate information from groupby.apply() on a stacked object,17701232,open,0,,,5,2017-07-19T11:59:48Z,2020-10-04T16:09:22Z,,NONE,,,,"I use this stack, groupby, unstack quite frequently. e.g. [here](https://gist.github.com/rabernat/bc4c6990eb20942246ce967e6c9c3dbe) An issue I have is that after `groupby('allpoints').apply()`, the coordinate names do not get carried through. i.e. the coordinate names are now: `allpoints_level_0` and `allpoints_level_1`. Then after `unstacking` I rename them back to lat/lon etc. Do you ever encounter this? Is there a way to carry them through and is this an issue for others? ``` import xarray as xr import numpy as np ds = xr.DataArray(np.ndarray((180,360,2000)), coords={'lat':np.arange(90,-90,-1), 'lon':np.arange(-180,180), 'time':range(2000)}) ds array([[[ 0.623891, -0.044304, ..., 1.015785, 0.009088], [-0.7375 , 0.380369, ..., 0.788351, -0.69295 ], ..., [ 0.171894, 0.517164, ..., -0.946908, -0.597802], [ 0.353743, 0.005539, ..., -1.436965, -0.190099]], .... Coordinates: * lat (lat) int32 90 89 88 87 86 85 84 83 82 81 80 79 78 77 76 75 74 ... * lon (lon) int32 -180 -179 -178 -177 -176 -175 -174 -173 -172 -171 ... * time (time) int32 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 .. ``` Now we stack the data by allpoints. **Note that the info about original coordinates (lat / lon) is still there...** `dst = ds.stack(allpoints=['lat','lon'])` ``` array([[ 0.623891, -0.7375 , 0.053525, ..., 0.379701, 0.130618, 0.11094 ], [-0.044304, 0.380369, -0.410632, ..., -0.739881, 0.203219, -0.506303], [-1.762024, -1.019424, 2.580218, ..., 1.491677, 1.189149, -0.072223], ..., [-0.896298, 0.333163, -1.751641, ..., 1.90315 , 2.642813, -0.913787], [ 1.015785, 0.788351, 0.379997, ..., 0.864934, 0.889001, -1.363458], [ 0.009088, -0.69295 , -1.276184, ..., 1.220656, 0.895599, 0.848757]]) Coordinates: * time (time) int32 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ... * allpoints (allpoints) MultiIndex - lat (allpoints) int64 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ... - lon (allpoints) int64 -180 -179 -178 -177 -176 -175 -174 -173 ... ``` Now apply `groupby().apply()` `dsg=dst.groupby('allpoints').apply(my_custom_function) ` ``` array([ 0.013697, 0.006272, 0.009744, ..., -0.016265, -0.002108, -0.014733]) Coordinates: * allpoints (allpoints) MultiIndex - allpoints_level_0 (allpoints) int64 -89 -89 -89 -89 -89 -89 -89 -89 -89 ... - allpoints_level_1 (allpoints) int64 -180 -179 -178 -177 -176 -175 -174 ... ``` So now we have lost the `'lat','lon'`. However **if we skip the groupby part** and go straight to `unstack`, this would be carried through. `dst.unstack('allpoints')` ``` array([[[ 0.623891, -0.7375 , ..., 0.171894, 0.353743], [ 1.780691, -0.747431, ..., 0.038754, 0.615228], ..., Coordinates: * time (time) int32 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ... * lat (lat) int64 90 89 88 87 86 85 84 83 82 81 80 79 78 77 76 75 74 ... * lon (lon) int64 -180 -179 -178 -177 -176 -175 -174 -173 -172 -171 ... ``` ","{""url"": ""https://api.github.com/repos/pydata/xarray/issues/1483/reactions"", ""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,,13221727,issue