diff --git a/libcodonusage/__init__.py b/libcodonusage/__init__.py
index dc6f97f98c2c936887781eee456fdbeabeb2b9c4..998abc6415bbc483052aaea698c553fd7730f1d1 100644
--- a/libcodonusage/__init__.py
+++ b/libcodonusage/__init__.py
@@ -1,6 +1,6 @@
 __copyright__ = "Copyright (C) 2022-2023 Blaise Li, Marie Anselmet"
 __licence__ = "GNU GPLv3"
-__version__ = "0.28.5"
+__version__ = "0.29.0"
 from .libcodonusage import (
     aa2colour,
     aa_usage,
diff --git a/libcodonusage/libcodonusage.py b/libcodonusage/libcodonusage.py
index 69aca04ae256558a5bb4758ef7fa19c13f41583e..856af0e8b17effcf9e2db5efa6979394fb012888 100644
--- a/libcodonusage/libcodonusage.py
+++ b/libcodonusage/libcodonusage.py
@@ -14,7 +14,7 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <https://www.gnu.org/licenses/>.
 """Functions used in Jupyter notebooks."""
-from itertools import combinations
+from itertools import chain, combinations
 import json
 from operator import attrgetter, itemgetter
 from pathlib import Path
@@ -442,19 +442,13 @@ SUZUKI_DOI = "10.1016/j.febslet.2005.10.032"
 SUZUKI_LINK = f"[Suzuki et al (2005)](https://doi.org/{SUZUKI_DOI})"
 
 
-def remove_codons_old(codon_counts, codon_list):
-    """
-    Filter out codons in a table *codon_counts* based on codons
-    present in the list *codon_list* (like stop codons).
-    """
-    codon_counts.drop(columns=codon_list, inplace=True)
-    return codon_counts
-
-
 def remove_codons(codon_counts, codon_list):
     """
     Filter out codons in a table *codon_counts* based on codons
     present in the list *codon_list* (like stop codons).
+    When the columns of *codon_counts* are a MultiIndex with a first
+    level corresponding to the amino-acid and the second to the codon,
+    the codons should be specified as (aa, codon) tuples.
     """
     return codon_counts.drop(columns=codon_list)
 
@@ -486,14 +480,14 @@ def max_codon_counts(row, codons):
 
 
 def group_codons_by_class(
-        codon_counts, group_name, dict_classes,
-        mode="max", keep_only_groups=False):
+        codon_counts, group_name, codon_classes,
+        mode="max", keep_only_groups=False, replace_groups=True):
     """
     Group codons given specific classes in *codon_counts* table.
 
     *group_name* contains the name of the grouping, and plays the role
     of aa names in the original codon counts table.
-    *dict_classes* contains the different classes under this grouping
+    *codon_classes* contains the different classes under this grouping
     as keys and the associated list of codons as values.
     *mode* defines the way grouping is computed. It should be the name of
     a method of the `GroupBy` object, like "sum" or "max".
@@ -502,14 +496,18 @@ def group_codons_by_class(
     If *mode* is "sum", the sum of counts values for all codons
     belonging to the same class is used for the grouped class.
     *keep_only_groups* is a boolean set to True if you want to filter out
-    other codons than the ones specified in dict_classes.
+    other codons than the ones specified in codon_classes.
     If set to False (default), the original codon_counts table
     is returned with additional columns for the grouped_classes.
+    If the boolean *replace_groups* is set to True (default), the full
+    count table will be returned, except the columns used to compute the
+    grouped values. This option is ignored if *keep_only_groups* has been
+    set to True.
     """
     col_renames = {
         (aa, codon): (class_name, group_name, codon)
-        for class_name in dict_classes
-        for (aa, codon) in dict_classes[class_name]}
+        for class_name in codon_classes
+        for (aa, codon) in codon_classes[class_name]}
     codon_counts_pre_group = codon_counts[col_renames.keys()]
     # We add a level to the column names,
     # "codon", becoming "sub_codon", will disappear
@@ -524,6 +522,10 @@ def group_codons_by_class(
         mode)()
     if keep_only_groups:
         return codon_counts_grouped
+    if replace_groups:
+        return remove_codons(
+            pd.concat([codon_counts, codon_counts_grouped], axis=1),
+            chain.from_iterable(codon_classes.values()))
     return pd.concat([codon_counts, codon_counts_grouped], axis=1)