name AA-10 AA-9 10 9 10a 09a A10a-2 A9a-3 df0 = xl("A1:A9", headers=True) # 数字と文字を分割 df1 = df0["name"].astype(str).str.split("(\d+)", regex=True, expand=True) # 0補完 df2 = df1.iloc[:, 1::2].apply(lambda s: s.str.zfill(s.fillna("").str.len().max())) # 上書き df1.update(df2) # 文字結合 df0["temp"] = df1.fillna("").astype(str).apply(lambda x: "".join(x), axis=1) # カスタムソート def custom_sort(x): if x.isnumeric(): return (0, int(x)) else: return (1, x) # 数字のみは優先 df0["sort"] = df0["temp"].apply(custom_sort) df3 = df0.sort_values(by="sort") df3["name"]