# Query missing/NaN values

**URL:** <https://forum.tiledb.com/t/query-missing-nan-values/769>\
**Category:** Uncategorized\
**Created:** [February 11, 2025, 1:30am UTC](https://forum.tiledb.com/t/query-missing-nan-values/769 "2025-02-11T01:30:10Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![nick-youngblut](https://yyz1.discourse-cdn.com/flex035/user_avatar/forum.tiledb.com/nick-youngblut/32/363_2.png) [@nick-youngblut](https://forum.tiledb.com/u/nick-youngblut)\
**Post date:** [February 11, 2025, 1:30am UTC](https://forum.tiledb.com/t/query-missing-nan-values/769/1 "2025-02-11T01:30:10Z")

</div>

[Query Conditions | TileDB Embedded Docs](https://docs.tiledb.com/main/how-to/arrays/reading-arrays/query-conditions) does not provide examples of querying for missing (NaN) values.  
How does one perform the equivalent of `isna()` or `== None` for querying in tiledb?

---

<div class="post-metadata">

**Author:** ![spencerseale](https://yyz1.discourse-cdn.com/flex035/user_avatar/forum.tiledb.com/spencerseale/32/340_2.png) [@spencerseale](https://forum.tiledb.com/u/spencerseale)\
**Post date:** [May 15, 2025, 4:58pm UTC](https://forum.tiledb.com/t/query-missing-nan-values/769/2 "2025-05-15T16:58:48Z")

</div>

Hi @nick-youngblut

We don’t support that directly in our core engine. Since I suspect this is SOMA related, you can do something like the following to get the coords from obs that can then be passed into the subsequent search ExperimentAxisQuery:

```python
from typing import List

import tiledbsoma 
import tiledb

def find_nonnull_obs(
    soma_uri: str,
    attr: str,
) -> List[int]:
    
    with tiledbsoma.Experiment.open(soma_uri) as exp:
        obs_uri = exp.obs.uri

    with tiledb.open(obs_uri) as arr:
        obs_df = arr.df[:] # can filter here with other query conditions for a smaller return size e.g. arr.query().df[:]

    null_joinids = obs_df.loc[~obs_df[attr].isnull(), "soma_joinid"]

    return null_joinids.tolist()

if __name__ == " __main__":

    non_null_joinids = find_nonnull_obs(
        uri,
        "tissue",
    )

    with tiledbsoma.Experiment.open(uri) as exp:

        print(f"n cells all: {exp.obs.count}")

        query = exp.axis_query(
            measurement_name="RNA",
            obs_query=tiledbsoma.AxisQuery(coords=(non_null_joinids,))
        )

        print(f"n cells non-null: {query.n_obs}")
        print(f"proportion null: {(exp.obs.count - query.n_obs) / exp.obs.count}")

```

---

<div class="post-metadata">

**Author:** ![spencerseale](https://yyz1.discourse-cdn.com/flex035/user_avatar/forum.tiledb.com/spencerseale/32/340_2.png) [@spencerseale](https://forum.tiledb.com/u/spencerseale)\
**Post date:** [July 23, 2025, 10:13pm UTC](https://forum.tiledb.com/t/query-missing-nan-values/769/3 "2025-07-23T22:13:11Z")

</div>

Null query condition support added to tiledb-py == 0.34.1: [Release TileDB-Py 0.34.1 · TileDB-Inc/TileDB-Py · GitHub](https://github.com/TileDB-Inc/TileDB-Py/releases/tag/0.34.1)
