You can try pd.wide_to_long
then split and rename columns
df_ = pd.wide_to_long(df, ["sample_"], i="index", j="sample").reset_index()
df_[['index', 'number']] = df_['index'].str.split('/', expand=True)
df_ = df_.rename(columns={'index': 'letter', 'sample_': 'value'})
df_ = df_.assign(sample='sample_' + df_['sample'].astype(str), index=df_.index+1)
print(df_)
letter sample value number index
0 A sample_1 23 1 1
1 A sample_1 24 2 2
2 A sample_1 25 3 3
3 A sample_2 33 1 4
4 A sample_2 34 2 5
5 A sample_2 35 3 6
For a more nested version, you can use
df[['index', 'number']] = df['index'].str.split('/', expand=True)
df = (pd.wide_to_long(df, ["sample_"], i=["index", 'number'], j="sample").reset_index()
.rename(columns={'index': 'letter', 'sample_': 'value'})
.pipe(lambda df: df.assign(sample='sample_' + df['sample'].astype(str), index=df.index+1))
)