From 9b157570e050daea7ecae1074ddc36ad2eed0184 Mon Sep 17 00:00:00 2001 From: Philipp A Date: Mon, 27 Aug 2018 15:53:59 +0200 Subject: [PATCH] Allow deleting obs/var cols Fixes #29 --- anndata/base.py | 12 ++++++++++++ anndata/tests/base.py | 9 +++++++++ 2 files changed, 21 insertions(+) diff --git a/anndata/base.py b/anndata/base.py index c19a71a0d..0bd3bd11e 100644 --- a/anndata/base.py +++ b/anndata/base.py @@ -13,6 +13,7 @@ import numpy as np from numpy import ma import pandas as pd +from numpy.lib.recfunctions import rec_drop_fields from pandas.core.index import RangeIndex from pandas.api.types import is_string_dtype, is_categorical from scipy import sparse @@ -156,6 +157,17 @@ def __setitem__(self, key, arr): new = BoundRecArr(new, self._parent, self._attr) setattr(self._parent, self._attr, new) + def __delitem__(self, key): + """Delete field with name.""" + if key not in self.dtype.names: + raise ValueError( + 'Currently, can only delete single names from {}.' + .format(self.dtype.names) + ) + new_array = rec_drop_fields(self, key) + new = BoundRecArr(new_array, self._parent, self._attr) + setattr(self._parent, self._attr, new) + def to_df(self): """Convert to pandas dataframe.""" df = pd.DataFrame(index=RangeIndex(0, self.shape[0], name=None)) diff --git a/anndata/tests/base.py b/anndata/tests/base.py index 8a64cbd0f..bdc741400 100644 --- a/anndata/tests/base.py +++ b/anndata/tests/base.py @@ -187,6 +187,15 @@ def test_append_col(): adata.obs['new4'] = 'far too long'.split() +def test_delete_col(): + adata = AnnData(np.array([[1, 2, 3], [4, 5, 6]]), dict(o1=[1, 2], o2=[3, 4])) + assert ['o1', 'o2'] == adata.obs_keys() + + del adata.obs['o1'] + assert ['o2'] == adata.obs_keys() + assert [3, 4] == adata.obs['o2'].tolist() + + def test_set_obs(): adata = AnnData(np.array([[1, 2, 3], [4, 5, 6]]))