Установите для индекса все столбцы, кроме несущих, а затем используйте стек.
df.set_index(['Service', 'Bill Weight', 'Zone', 'Resi']).stack().to_dict()
{('1DEA', 1, 2, 'N', 'DHL'): 9999.0,
('1DEA', 1, 2, 'N', 'FedEx'): 9999.0,
('1DEA', 1, 2, 'N', 'UPS'): 33.02,
('1DEA', 1, 2, 'N', 'USPS'): 9999.0,
('1DEA', 2, 2, 'N', 'DHL'): 9999.0,
('1DEA', 2, 2, 'N', 'FedEx'): 9999.0,
('1DEA', 2, 2, 'N', 'UPS'): 33.02,
('1DEA', 2, 2, 'N', 'USPS'): 9999.0,
('1DEA', 3, 2, 'N', 'DHL'): 9999.0,
('1DEA', 3, 2, 'N', 'FedEx'): 9999.0,
('1DEA', 3, 2, 'N', 'UPS'): 33.02,
('1DEA', 3, 2, 'N', 'USPS'): 9999.0}
Постижение
{(*r[:4], c): v for r in df.values for c, v in zip(df.columns[4:], r[4:])}
{('1DEA', 1, 2, 'N', 'DHL'): 9999,
('1DEA', 1, 2, 'N', 'FedEx'): 9999,
('1DEA', 1, 2, 'N', 'UPS'): 33.02,
('1DEA', 1, 2, 'N', 'USPS'): 9999,
('1DEA', 2, 2, 'N', 'DHL'): 9999,
('1DEA', 2, 2, 'N', 'FedEx'): 9999,
('1DEA', 2, 2, 'N', 'UPS'): 33.02,
('1DEA', 2, 2, 'N', 'USPS'): 9999,
('1DEA', 3, 2, 'N', 'DHL'): 9999,
('1DEA', 3, 2, 'N', 'FedEx'): 9999,
('1DEA', 3, 2, 'N', 'UPS'): 33.02,
('1DEA', 3, 2, 'N', 'USPS'): 9999}