Ich kann es ja überhaupt nicht leiden, wenn man soviel schreibt, dann noch mit festen Strings (siehe die römischen Zahlen) arbeitet, aber das ist erstmal meine Lösung (nach einem kleinen nervous Breakdown). Wenn jemand was schöneres hat, hab ich immer noch Interesse, das Thema begleitet mich länger.
df = df.astype(str)
df['regexp_replace'] = df['regexp_replace'].str.replace(r'([a-zA-Z])(\d)', r'\1 \2', regex=True)
df['regexp_replace'] = df['regexp_replace'].str.replace(' ' , '')
df['regexp_replace'] = df['regexp_replace'].str.strip()
split_cols = df['regexp_replace'].str.split('\s', expand=True)
split_cols = split_cols.add_prefix('Sortierung_')
df = pd.concat([df.drop('regexp_replace', axis=1), split_cols], axis=1)
df['Sortierung_1'] = df['Sortierung_1'].str.replace('^I$', '1', regex=True)
df['Sortierung_1'] = df['Sortierung_1'].str.replace('^II$', '2', regex=True)
df['Sortierung_1'] = df['Sortierung_1'].str.replace('^III$', '3', regex=True)
df['Sortierung_1'] = df['Sortierung_1'].str.replace('^IV$', '4', regex=True)
df['Sortierung_1'] = df['Sortierung_1'].str.replace('^V$', '5', regex=True)
df['Sortierung_1'] = df['Sortierung_1'].str.replace('^VI$', '6', regex=True)
df['Sortierung_1'] = df['Sortierung_1'].str.replace('^VII$', '7', regex=True)
df['Sortierung_1'] = df['Sortierung_1'].str.replace('^VIII$', '8', regex=True)
df['Sortierung_1'] = df['Sortierung_1'].str.replace('^IX$', '9', regex=True)
df['Sortierung_1'] = df['Sortierung_1'].str.replace('^XQ$', '10', regex=True)
#ich weiß, dass das nicht 10 ist, aber so scheint es verwendet zu werden
df['Sortierung_1_1'] = df['Sortierung_1'].str.extract('(\d+)', expand=False).fillna(0).astype(int)
df['Sortierung_1_2'] = df['Sortierung_1'].str.extract('([a-zA-Z]+)', expand=False)
df['Sortierung_2_1'] = df['Sortierung_2'].str.extract('(\d+)', expand=False).fillna(0).astype(int)
df['Sortierung_2_2'] = df['Sortierung_2'].str.extract('([a-zA-Z]+)', expand=False)
df['Sortierung_3_1'] = df['Sortierung_3'].str.extract('(\d+)', expand=False).fillna(0).astype(int)
df['Sortierung_3_2'] = df['Sortierung_3'].str.extract('([a-zA-Z]+)', expand=False)
df['Sortierung_4_1'] = df['Sortierung_4'].str.extract('(\d+)', expand=False).fillna(0).astype(int)
df['Sortierung_4_2'] = df['Sortierung_4'].str.extract('([a-zA-Z]+)', expand=False)
df['Sortierung_5_1'] = df['Sortierung_5'].str.extract('(\d+)', expand=False).fillna(0).astype(int)
df['Sortierung_5_2'] = df['Sortierung_5'].str.extract('([a-zA-Z]+)', expand=False)
df['Sortierung_6_1'] = df['Sortierung_6'].str.extract('(\d+)', expand=False).fillna(0).astype(int)
df['Sortierung_6_2'] = df['Sortierung_6'].str.extract('([a-zA-Z]+)', expand=False)
df['Sortierung_7_1'] = df['Sortierung_7'].str.extract('(\d+)', expand=False).fillna(0).astype(int)
df['Sortierung_7_2'] = df['Sortierung_7'].str.extract('([a-zA-Z]+)', expand=False)
df['Sortierung_8_1'] = df['Sortierung_8'].str.extract('(\d+)', expand=False).fillna(0).astype(int)
df['Sortierung_8_2'] = df['Sortierung_8'].str.extract('([a-zA-Z]+)', expand=False)
Jetzt kann ich einzeln über alle Spalten sortieren und am Ende scheint es zu passen.