@@ -1125,7 +1125,19 @@ def make_final_solution(
11251125 pass
11261126
11271127 processAvg = pd .DataFrame (processAvg .astype (float ))
1128- processes = processAvg .set_index (index )
1128+ # Convert index to pandas Index to handle StringArray compatibility in Python 3.12+
1129+ # StringArray is unhashable and cannot be used directly with set_index
1130+ if isinstance (index , str ):
1131+ processes = processAvg .set_index (index )
1132+ else :
1133+ # Convert to list first, then create pandas Index and assign directly
1134+ if hasattr (index , 'tolist' ):
1135+ index_list = index .tolist ()
1136+ else :
1137+ index_list = list (index )
1138+ # Assign index directly instead of using set_index to avoid column lookup
1139+ processes = processAvg .copy ()
1140+ processes .index = pd .Index (index_list )
11291141 processes .columns = allsigids
11301142 processes = processes .rename_axis ("MutationType" , axis = "columns" )
11311143 processes .to_csv (
@@ -1140,8 +1152,17 @@ def make_final_solution(
11401152 index_label = [processes .columns .name ],
11411153 )
11421154 exposureAvg = pd .DataFrame (exposureAvg .astype (int ))
1143- allsigids = np .array (allsigids )
1144- exposures = exposureAvg .set_index (allsigids )
1155+ # Convert allsigids to list to handle StringArray compatibility in Python 3.12+
1156+ if isinstance (allsigids , str ):
1157+ allsigids_list = allsigids
1158+ elif hasattr (allsigids , 'tolist' ):
1159+ allsigids_list = allsigids .tolist ()
1160+ else :
1161+ allsigids_list = list (allsigids )
1162+ allsigids = np .array (allsigids_list )
1163+ # Assign index directly instead of using set_index to avoid column lookup
1164+ exposures = exposureAvg .copy ()
1165+ exposures .index = pd .Index (allsigids_list )
11451166 exposures .columns = allcolnames
11461167 exposures = exposures .T
11471168 exposures = exposures .rename_axis ("Samples" , axis = "columns" )
@@ -1258,7 +1279,18 @@ def make_final_solution(
12581279 if refit_denovo_signatures :
12591280 try :
12601281 process_std_error = pd .DataFrame (process_std_error )
1261- processSTE = process_std_error .set_index (index )
1282+ # Convert index to pandas Index to handle StringArray compatibility in Python 3.12+
1283+ if isinstance (index , str ):
1284+ processSTE = process_std_error .set_index (index )
1285+ else :
1286+ # Convert to list first, then create pandas Index and assign directly
1287+ if hasattr (index , 'tolist' ):
1288+ index_list = index .tolist ()
1289+ else :
1290+ index_list = list (index )
1291+ # Assign index directly instead of using set_index to avoid column lookup
1292+ processSTE = process_std_error .copy ()
1293+ processSTE .index = pd .Index (index_list )
12621294 processSTE .columns = allsigids
12631295 processSTE = processSTE .rename_axis ("MutationType" , axis = "columns" )
12641296 processSTE .to_csv (
@@ -1276,7 +1308,16 @@ def make_final_solution(
12761308 pass
12771309 if refit_denovo_signatures :
12781310 try :
1279- signature_stats = signature_stats .set_index (allsigids )
1311+ # Convert allsigids to list to handle StringArray compatibility in Python 3.12+
1312+ if isinstance (allsigids , str ):
1313+ allsigids_list = allsigids
1314+ elif hasattr (allsigids , 'tolist' ):
1315+ allsigids_list = allsigids .tolist ()
1316+ else :
1317+ allsigids_list = list (allsigids )
1318+ # Assign index directly instead of using set_index to avoid column lookup
1319+ signature_stats = signature_stats .copy ()
1320+ signature_stats .index = pd .Index (allsigids_list )
12801321 signature_stats = signature_stats .rename_axis ("Signatures" , axis = "columns" )
12811322 signature_stats .to_csv (
12821323 layer_directory
0 commit comments