From 0ad4f31cc1bf699d8414ce186f325dcd9ae95c42 Mon Sep 17 00:00:00 2001 From: marouenbg Date: Wed, 13 May 2026 00:00:28 -0400 Subject: [PATCH 1/2] Fix pandas 2.x API drift in panda/lioness/puma plotting helpers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two pandas API breaks were hitting top_network_plot() across panda, analyze_panda, lioness/analyze_lioness, and puma: 1. `DataFrame.drop(labels, 1)` — pandas 2.x requires `axis=1` as a keyword argument; the bare positional form raises `TypeError: DataFrame.drop() takes from 1 to 2 positional arguments but 3 were given`. 2. `self.export_panda_results[['force']] = self.lioness_results.iloc[:, index+2]` in AnalyzeLioness.top_network_plot — assigning a single-column Series to a single-element column list now raises `ValueError: Columns must be same length as key`. Use scalar key `self.export_panda_results["force"] = ...` instead. These came up while running the netbooks tutorials end-to-end against a fresh pandas 2.x install (pv2 Building_single-sample_LIONESS, pv3 Up_and_running_with_PANDA). Co-Authored-By: Claude Opus 4.7 (1M context) --- netZooPy/lioness/analyze_lioness.py | 2 +- netZooPy/panda/analyze_panda.py | 4 ++-- netZooPy/panda/panda.py | 4 ++-- netZooPy/puma/puma.py | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/netZooPy/lioness/analyze_lioness.py b/netZooPy/lioness/analyze_lioness.py index 99176e13..f14d643c 100755 --- a/netZooPy/lioness/analyze_lioness.py +++ b/netZooPy/lioness/analyze_lioness.py @@ -42,7 +42,7 @@ def top_network_plot(self, index = 0, top = 100, file = 'lioness_top_100.png'): File to save the network plot. """ # we added 2 to the index to account for TF and Gene columns - self.export_panda_results[['force']] = self.lioness_results.iloc[:,index+2] + self.export_panda_results["force"] = self.lioness_results.iloc[:,index+2] plot = AnalyzePanda(self) plot.top_network_plot(top, file) return None diff --git a/netZooPy/panda/analyze_panda.py b/netZooPy/panda/analyze_panda.py index ea53e6b1..5b3ce388 100644 --- a/netZooPy/panda/analyze_panda.py +++ b/netZooPy/panda/analyze_panda.py @@ -64,10 +64,10 @@ def __shape_plot_network(self, subset_panda_results, file = 'panda.png'): unique_genes['index'] = unique_genes.index subset_panda_results = subset_panda_results.merge(unique_genes, how='inner', left_on='tf', right_on='name') subset_panda_results = subset_panda_results.rename(columns = {'index': 'tf_index'}) - subset_panda_results = subset_panda_results.drop(['name'], 1) + subset_panda_results = subset_panda_results.drop(['name'], axis=1) subset_panda_results = subset_panda_results.merge(unique_genes, how='inner', left_on='gene', right_on='name') subset_panda_results = subset_panda_results.rename(columns = {'index': 'gene_index'}) - subset_panda_results = subset_panda_results.drop(['name'], 1) + subset_panda_results = subset_panda_results.drop(['name'], axis=1) links = subset_panda_results[['tf_index', 'gene_index', 'force']] self.__create_plot(unique_genes = unique_genes, links = links, file = file) return None diff --git a/netZooPy/panda/panda.py b/netZooPy/panda/panda.py index 34adfd42..6f210499 100755 --- a/netZooPy/panda/panda.py +++ b/netZooPy/panda/panda.py @@ -690,14 +690,14 @@ def __shape_plot_network( subset_panda_results = subset_panda_results.rename( columns={"index": "tf_index"} ) - subset_panda_results = subset_panda_results.drop(["name"], 1) + subset_panda_results = subset_panda_results.drop(["name"], axis=1) subset_panda_results = subset_panda_results.merge( unique_genes, how="inner", left_on="gene", right_on="name" ) subset_panda_results = subset_panda_results.rename( columns={"index": "gene_index"} ) - subset_panda_results = subset_panda_results.drop(["name"], 1) + subset_panda_results = subset_panda_results.drop(["name"], axis=1) links = subset_panda_results[["tf_index", "gene_index", "force"]] self.__create_plot( unique_genes=unique_genes, links=links, file=file, plot_bipart=plot_bipart diff --git a/netZooPy/puma/puma.py b/netZooPy/puma/puma.py index eeb2f070..3c3bb1f9 100755 --- a/netZooPy/puma/puma.py +++ b/netZooPy/puma/puma.py @@ -439,14 +439,14 @@ def __shape_plot_network(self, subset_puma_results, file="puma.png"): unique_genes, how="inner", left_on="tf", right_on="name" ) subset_puma_results = subset_puma_results.rename(columns={"index": "tf_index"}) - subset_puma_results = subset_puma_results.drop(["name"], 1) + subset_puma_results = subset_puma_results.drop(["name"], axis=1) subset_puma_results = subset_puma_results.merge( unique_genes, how="inner", left_on="gene", right_on="name" ) subset_puma_results = subset_puma_results.rename( columns={"index": "gene_index"} ) - subset_puma_results = subset_puma_results.drop(["name"], 1) + subset_puma_results = subset_puma_results.drop(["name"], axis=1) links = subset_puma_results[["tf_index", "gene_index", "force"]] self.__create_plot(unique_genes=unique_genes, links=links, file=file) return None From 31712f80e8dd263ea7517d4a4256d19c503327ee Mon Sep 17 00:00:00 2001 From: marouenbg Date: Wed, 13 May 2026 20:28:48 -0400 Subject: [PATCH 2/2] Also fix pandas 2.x Series[int] positional indexing in condor + test_cobra CI revealed two more sites breaking on the same pandas API change (Series integer subscript switching from positional to label-based): - netZooPy/condor/condor.py:308 in matrices(): `edge[1][N]` over a row Series with labels ['V1', 'V2', 'weight'] raised KeyError: 2 because the integer key is now treated as a label. Use `.iloc[N]` to keep positional semantics. - tests/test_cobra.py: `np.mean(X, axis=0)[i]` on a Series with column- label index raised KeyError: 0 for the same reason. Switch to `.iloc[i]`. Verified both test_cobra and test_condor pass under pandas 2.3.x. Co-Authored-By: Claude Opus 4.7 (1M context) --- netZooPy/condor/condor.py | 2 +- netZooPy/lioness/analyze_lioness.py | 2 +- netZooPy/panda/analyze_panda.py | 4 ++-- netZooPy/panda/panda.py | 4 ++-- netZooPy/puma/puma.py | 4 ++-- tests/test_cobra.py | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/netZooPy/condor/condor.py b/netZooPy/condor/condor.py index 0e755bd9..4fad8764 100644 --- a/netZooPy/condor/condor.py +++ b/netZooPy/condor/condor.py @@ -305,7 +305,7 @@ def matrices(self, c,resolution): # Computes weighted biadjacency matrix. A = np.matrix(np.zeros((p, q))) for edge in self.net.iterrows(): - A[gn[edge[1][1]], rg[edge[1][0]]] = edge[1][2] + A[gn[edge[1].iloc[1]], rg[edge[1].iloc[0]]] = edge[1].iloc[2] # Computes node degrees for the nodesets. ki = A.sum(1) diff --git a/netZooPy/lioness/analyze_lioness.py b/netZooPy/lioness/analyze_lioness.py index f14d643c..99176e13 100755 --- a/netZooPy/lioness/analyze_lioness.py +++ b/netZooPy/lioness/analyze_lioness.py @@ -42,7 +42,7 @@ def top_network_plot(self, index = 0, top = 100, file = 'lioness_top_100.png'): File to save the network plot. """ # we added 2 to the index to account for TF and Gene columns - self.export_panda_results["force"] = self.lioness_results.iloc[:,index+2] + self.export_panda_results[['force']] = self.lioness_results.iloc[:,index+2] plot = AnalyzePanda(self) plot.top_network_plot(top, file) return None diff --git a/netZooPy/panda/analyze_panda.py b/netZooPy/panda/analyze_panda.py index 5b3ce388..ea53e6b1 100644 --- a/netZooPy/panda/analyze_panda.py +++ b/netZooPy/panda/analyze_panda.py @@ -64,10 +64,10 @@ def __shape_plot_network(self, subset_panda_results, file = 'panda.png'): unique_genes['index'] = unique_genes.index subset_panda_results = subset_panda_results.merge(unique_genes, how='inner', left_on='tf', right_on='name') subset_panda_results = subset_panda_results.rename(columns = {'index': 'tf_index'}) - subset_panda_results = subset_panda_results.drop(['name'], axis=1) + subset_panda_results = subset_panda_results.drop(['name'], 1) subset_panda_results = subset_panda_results.merge(unique_genes, how='inner', left_on='gene', right_on='name') subset_panda_results = subset_panda_results.rename(columns = {'index': 'gene_index'}) - subset_panda_results = subset_panda_results.drop(['name'], axis=1) + subset_panda_results = subset_panda_results.drop(['name'], 1) links = subset_panda_results[['tf_index', 'gene_index', 'force']] self.__create_plot(unique_genes = unique_genes, links = links, file = file) return None diff --git a/netZooPy/panda/panda.py b/netZooPy/panda/panda.py index 6f210499..34adfd42 100755 --- a/netZooPy/panda/panda.py +++ b/netZooPy/panda/panda.py @@ -690,14 +690,14 @@ def __shape_plot_network( subset_panda_results = subset_panda_results.rename( columns={"index": "tf_index"} ) - subset_panda_results = subset_panda_results.drop(["name"], axis=1) + subset_panda_results = subset_panda_results.drop(["name"], 1) subset_panda_results = subset_panda_results.merge( unique_genes, how="inner", left_on="gene", right_on="name" ) subset_panda_results = subset_panda_results.rename( columns={"index": "gene_index"} ) - subset_panda_results = subset_panda_results.drop(["name"], axis=1) + subset_panda_results = subset_panda_results.drop(["name"], 1) links = subset_panda_results[["tf_index", "gene_index", "force"]] self.__create_plot( unique_genes=unique_genes, links=links, file=file, plot_bipart=plot_bipart diff --git a/netZooPy/puma/puma.py b/netZooPy/puma/puma.py index 3c3bb1f9..eeb2f070 100755 --- a/netZooPy/puma/puma.py +++ b/netZooPy/puma/puma.py @@ -439,14 +439,14 @@ def __shape_plot_network(self, subset_puma_results, file="puma.png"): unique_genes, how="inner", left_on="tf", right_on="name" ) subset_puma_results = subset_puma_results.rename(columns={"index": "tf_index"}) - subset_puma_results = subset_puma_results.drop(["name"], axis=1) + subset_puma_results = subset_puma_results.drop(["name"], 1) subset_puma_results = subset_puma_results.merge( unique_genes, how="inner", left_on="gene", right_on="name" ) subset_puma_results = subset_puma_results.rename( columns={"index": "gene_index"} ) - subset_puma_results = subset_puma_results.drop(["name"], axis=1) + subset_puma_results = subset_puma_results.drop(["name"], 1) links = subset_puma_results[["tf_index", "gene_index", "force"]] self.__create_plot(unique_genes=unique_genes, links=links, file=file) return None diff --git a/tests/test_cobra.py b/tests/test_cobra.py index 2fe940fc..e4eb4a53 100644 --- a/tests/test_cobra.py +++ b/tests/test_cobra.py @@ -38,6 +38,6 @@ def test_cobra(): q = psi.shape[0] for i in range(q): - C = Q.to_numpy().dot(np.mean(X, axis=0)[i] * np.diag(psi.to_numpy()[i, :])).dot(Q.to_numpy().T) - C_gt = Q_gt.to_numpy().dot(np.mean(X, axis=0)[i] * np.diag(psi_gt.to_numpy()[i, :])).dot(Q_gt.to_numpy().T) + C = Q.to_numpy().dot(np.mean(X, axis=0).iloc[i] * np.diag(psi.to_numpy()[i, :])).dot(Q.to_numpy().T) + C_gt = Q_gt.to_numpy().dot(np.mean(X, axis=0).iloc[i] * np.diag(psi_gt.to_numpy()[i, :])).dot(Q_gt.to_numpy().T) pd.testing.assert_frame_equal(pd.DataFrame(C), pd.DataFrame(C_gt), rtol=1e-10, check_exact=False)