# How to reorder adata according to sorted indices?

**URL:** <https://discourse.scverse.org/t/how-to-reorder-adata-according-to-sorted-indices/2109>\
**Category:** anndata\
**Created:** [February 22, 2024, 4:19am UTC](https://discourse.scverse.org/t/how-to-reorder-adata-according-to-sorted-indices/2109 "2024-02-22T04:19:16Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![malonzm1](https://avatars.discourse-cdn.com/v4/letter/m/9de0a6/32.png) [@malonzm1](https://discourse.scverse.org/u/malonzm1)\
**Post date:** [February 22, 2024, 4:19am UTC](https://discourse.scverse.org/t/how-to-reorder-adata-according-to-sorted-indices/2109/1 "2024-02-22T04:19:16Z")

</div>

Hi,

I would like to sort the indices of my adata and reorder the adata according to the sorted indices then save it as a scanpy object. I tried the following:

```auto
adata = sc.read_h5ad(filename='result.h5ad')
nindex = adata.obs.index
nindex.sort()
adata = adata[nindex,:]
adata.write_h5ad(filename='result.h5ad')

```

But I get the following error:

```auto
Traceback (most recent call last):
  File "/scratch/project_2009639/scripts/pan-autoimmune/scvi/combine_10x_4.py", line 100, in <module>
    adata.write_h5ad(filename='10x_all.h5ad')
  File "/PUHTI_TYKKY_Cq2gHLh/miniconda/envs/env1/lib/python3.9/site-packages/anndata/_core/anndata.py", line 2017, in write_h5ad
    write_h5ad(
  File "/PUHTI_TYKKY_Cq2gHLh/miniconda/envs/env1/lib/python3.9/site-packages/anndata/_io/h5ad.py", line 91, in write_h5ad
    write_elem(f, "X", adata.X, dataset_kwargs=dataset_kwargs)
  File "/PUHTI_TYKKY_Cq2gHLh/miniconda/envs/env1/lib/python3.9/site-packages/anndata/_core/anndata.py", line 683, in X
    _subset(self._adata_ref.X, (self._oidx, self._vidx)),
  File "/PUHTI_TYKKY_Cq2gHLh/miniconda/envs/env1/lib/python3.9/functools.py", line 888, in wrapper
    return dispatch(args[0]. __class__ )(*args, **kw)
  File "/PUHTI_TYKKY_Cq2gHLh/miniconda/envs/env1/lib/python3.9/site-packages/anndata/_core/index.py", line 168, in _subset_spmatrix
    return a[subset_idx]
  File "/PUHTI_TYKKY_Cq2gHLh/miniconda/envs/env1/lib/python3.9/site-packages/scipy/sparse/_index.py", line 77, in __getitem__
    return self._get_arrayXslice(row, col)
  File "/PUHTI_TYKKY_Cq2gHLh/miniconda/envs/env1/lib/python3.9/site-packages/scipy/sparse/_csr.py", line 216, in _get_arrayXslice
    return self._major_index_fancy(row)._get_submatrix(minor=col)
  File "/PUHTI_TYKKY_Cq2gHLh/miniconda/envs/env1/lib/python3.9/site-packages/scipy/sparse/_compressed.py", line 713, in _major_index_fancy
    csr_row_index(M, indices, self.indptr, self.indices, self.data,
ValueError: Output dtype not compatible with inputs.

```

Any thoughts?

---

<div class="post-metadata">

**Author:** ![ivirshup](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.scverse.org/ivirshup/32/160_2.png) [@ivirshup](https://discourse.scverse.org/u/ivirshup)\
**Post date:** [February 22, 2024, 1:15pm UTC](https://discourse.scverse.org/t/how-to-reorder-adata-according-to-sorted-indices/2109/2 "2024-02-22T13:15:48Z")

</div>

I believe the call:

`index.sort()` should throw an error, since pandas `Index`’s are meant to be immutable.

E.g.:

```python
In [1]: import pandas as pd

In [2]: pd.DataFrame({"a": [1,2,3]}).index.sort()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[2], line 1
----> 1 pd.DataFrame({"a": [1,2,3]}).index.sort()

File ~/miniforge3/envs/scanpy-dev/lib/python3.11/site-packages/pandas/core/indexes/base.py:5868, in Index.sort(self, *args, **kwargs)
   5863 @final
   5864 def sort(self, *args, **kwargs):
   5865 """
   5866 Use sort_values instead.
   5867 """
-> 5868 raise TypeError("cannot sort an Index object in-place, use sort_values instead")

TypeError: cannot sort an Index object in-place, use sort_values instead

```

So you may have a bugged version of pandas.

So first, I would suggest making sure all your packages are up to date. Then:

```python
adata[adata.obs_names.sort_values(), :]

```

Should do what you need

---

<div class="post-metadata">

**Author:** ![malonzm1](https://avatars.discourse-cdn.com/v4/letter/m/9de0a6/32.png) [@malonzm1](https://discourse.scverse.org/u/malonzm1)\
**Post date:** [February 24, 2024, 8:53am UTC](https://discourse.scverse.org/t/how-to-reorder-adata-according-to-sorted-indices/2109/3 "2024-02-24T08:53:29Z")

</div>

Hi @ivirshup,

Thanks. I tried `adata.obs.sort_index(inplace=True)` which worked. However, the resulting umap only has one color.

 ![umap_10x_gse](https://canada1.discourse-cdn.com/flex035/uploads/forum11/original/1X/b29e5b812a64f1293eb8762574f9fea896ba3180.png)

Any ideas?

---

<div class="post-metadata">

**Author:** ![malonzm1](https://avatars.discourse-cdn.com/v4/letter/m/9de0a6/32.png) [@malonzm1](https://discourse.scverse.org/u/malonzm1)\
**Post date:** [February 24, 2024, 9:04am UTC](https://discourse.scverse.org/t/how-to-reorder-adata-according-to-sorted-indices/2109/4 "2024-02-24T09:04:24Z")

</div>

Btw, `adata[adata.obs_names.sort_values(), :]` still returns `ValueError: Output dtype not compatible with inputs.` when writing to file.

---

<div class="post-metadata">

**Author:** ![ivirshup](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.scverse.org/ivirshup/32/160_2.png) [@ivirshup](https://discourse.scverse.org/u/ivirshup)\
**Post date:** [February 27, 2024, 6:24pm UTC](https://discourse.scverse.org/t/how-to-reorder-adata-according-to-sorted-indices/2109/5 "2024-02-27T18:24:05Z")

</div>

This is sounding more like a bug. Could you open an issue on the anndata repository for this?
