Skip to content

Commit a63ca08

Browse files
xenium: use cell_id name for shapes index (#399)
1 parent 6960c4c commit a63ca08

2 files changed

Lines changed: 5 additions & 0 deletions

File tree

src/spatialdata_io/readers/xenium.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,7 @@ def _get_polygons(
605605
else:
606606
# Use cell_id (str) as GeoDataFrame index.
607607
geo_df = GeoDataFrame({"geometry": geoms}, index=indices_mapping["cell_id"].values)
608+
geo_df.index.name = "cell_id"
608609
else:
609610
# Fall back to extracting unique cell IDs from parquet (slow for large_string columns).
610611
# Triggered when indices_mapping is None: v < 1.3.0 (both nuclei and cells, because
@@ -617,6 +618,7 @@ def _get_polygons(
617618
unique_ids = id_col.filter(np.concatenate([[True], change_mask])).to_pylist()
618619
index = _decode_cell_id_column(pd.Series(unique_ids))
619620
geo_df = GeoDataFrame({"geometry": geoms}, index=index.values)
621+
geo_df.index.name = "cell_id"
620622

621623
scale = Scale([1.0 / specs["pixel_size"], 1.0 / specs["pixel_size"]], axes=("x", "y"))
622624
return ShapesModel.parse(geo_df, transformations={"global": scale})

tests/test_xenium.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ def test_example_data_index_integrity(dataset: str) -> None:
114114
assert sdata["nucleus_labels"]["scale0"]["image"].sel(y=3515.5, x=4618.5).data.compute() == 6392
115115
assert np.allclose(sdata['transcripts'].compute().loc[[0, 10000, 1113949]]['x'], [2.608911, 194.917831, 1227.499268])
116116
assert np.isclose(sdata['cell_boundaries'].loc['oipggjko-1'].geometry.centroid.x,736.4864931162789)
117+
assert sdata['cell_boundaries'].index.name == 'cell_id'
117118
index = sdata['nucleus_boundaries']['cell_id'].index[sdata['nucleus_boundaries']['cell_id'].eq('oipggjko-1')][0]
118119
assert np.isclose(sdata['nucleus_boundaries'].loc[index].geometry.centroid.x,736.4931256878282)
119120
assert np.array_equal(sdata['table'].X.indices[:3], [1, 3, 34])
@@ -140,6 +141,7 @@ def test_example_data_index_integrity(dataset: str) -> None:
140141
assert sdata["nucleus_labels"]["scale0"]["image"].sel(y=18.5, x=3015.5).data.compute() == 2764
141142
assert np.allclose(sdata['transcripts'].compute().loc[[0, 10000, 20000]]['x'], [174.258392, 12.210024, 214.759186])
142143
assert np.isclose(sdata['cell_boundaries'].loc['aaanbaof-1'].geometry.centroid.x, 43.96894317275074)
144+
assert sdata['cell_boundaries'].index.name == 'cell_id'
143145
index = sdata['nucleus_boundaries']['cell_id'].index[sdata['nucleus_boundaries']['cell_id'].eq('aaanbaof-1')][0]
144146
assert np.isclose(sdata['nucleus_boundaries'].loc[index].geometry.centroid.x,43.31874577809517)
145147
assert np.array_equal(sdata['table'].X.indices[:3], [1, 8, 19])
@@ -167,6 +169,7 @@ def test_example_data_index_integrity(dataset: str) -> None:
167169
assert sdata["nucleus_labels"]["scale0"]["image"].sel(y=4039.5, x=93.5).data.compute() == 274
168170
assert np.allclose(sdata['transcripts'].compute().loc[[0, 10000, 20000]]['x'], [43.296875, 62.484375, 93.125])
169171
assert np.isclose(sdata['cell_boundaries'].loc['aadmbfof-1'].geometry.centroid.x, 64.54541104696033)
172+
assert sdata['cell_boundaries'].index.name == 'cell_id'
170173
index = sdata['nucleus_boundaries']['cell_id'].index[sdata['nucleus_boundaries']['cell_id'].eq('aadmbfof-1')][0]
171174
assert np.isclose(sdata['nucleus_boundaries'].loc[index].geometry.centroid.x, 65.43305896114295)
172175
assert np.array_equal(sdata['table'].X.indices[:3], [3, 49, 53])

0 commit comments

Comments
 (0)