scverse / scverse/scanpy

KeyError: 1 in read_10x_mtx if genes.tsv has only one column

Open
#2,053 8 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
2.6k
Forks
779
Avg merge
1d 4h
Merged PRs (30d)
27

Description

I have a similar issue to this comment.

Carraro=sc.read_10x_mtx('/mnt/Carraro',var_names='gene_ids')

Switching to gene_symbols didn't work

Error messages:

--> This might be very slow. Consider passing `cache=True`, which enables much faster reading from a cache file.

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
~/miniconda3/envs/flng/lib/python3.8/site-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
   3360             try:
-> 3361                 return self._engine.get_loc(casted_key)
   3362             except KeyError as err:

~/miniconda3/envs/flng/lib/python3.8/site-packages/pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

~/miniconda3/envs/flng/lib/python3.8/site-packages/pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()

KeyError: 1

The above exception was the direct cause of the following exception:

KeyError                                  Traceback (most recent call last)
/tmp/ipykernel_29519/245170133.py in <module>
----> 1 Carraro=sc.read_10x_mtx('/mnt/Carraro',var_names='gene_ids')

~/miniconda3/envs/flng/lib/python3.8/site-packages/scanpy/readwrite.py in read_10x_mtx(path, var_names, make_unique, cache, cache_compression, gex_only)
    452     genefile_exists = (path / 'genes.tsv').is_file()
    453     read = _read_legacy_10x_mtx if genefile_exists else _read_v3_10x_mtx
--> 454     adata = read(
    455         str(path),
    456         var_names=var_names,

~/miniconda3/envs/flng/lib/python3.8/site-packages/scanpy/readwrite.py in _read_legacy_10x_mtx(path, var_names, make_unique, cache, cache_compression)
    491     elif var_names == 'gene_ids':
    492         adata.var_names = genes[0].values
--> 493         adata.var['gene_symbols'] = genes[1].values
    494     else:
    495         raise ValueError("`var_names` needs to be 'gene_symbols' or 'gene_ids'")

~/miniconda3/envs/flng/lib/python3.8/site-packages/pandas/core/frame.py in __getitem__(self, key)
   3456             if self.columns.nlevels > 1:
   3457                 return self._getitem_multilevel(key)
-> 3458             indexer = self.columns.get_loc(key)
   3459             if is_integer(indexer):
   3460                 indexer = [indexer]

~/miniconda3/envs/flng/lib/python3.8/site-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
   3361                 return self._engine.get_loc(casted_key)
   3362             except KeyError as err:
-> 3363                 raise KeyError(key) from err
   3364 
   3365         if is_scalar(key) and isna(key) and not self.hasnans:

KeyError: 1

Any ideas?

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start in scanpy/readwrite.py, specifically _read_legacy_10x_mtx and the genes.tsv handling shown in the traceback. Reproduce read_10x_mtx with a one-column genes.tsv and check both gene_ids and gene_symbols modes. Done means the input no longer raises KeyError: 1 and the resulting variable names and annotations remain valid.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
data
Issue type
Bug
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
42/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.