Начните с read_ json с записями ориентация:
df = pd.read_json('Input.json', orient='records')
Затем преобразуйте оба столбца отношение в версию "MultiIndexed" :
d = { tt: df[tt].apply(pd.Series) for tt in ['relation_start', 'relation_end'] }
wrk1 = pd.concat(d, axis=1, keys=d.keys())
Добавленный уровень MultiIndex - это уровень top ( Relations_start и Relations_end ), а индексные ключи в исходных значениях становятся вторыми level.
Третий шаг - преобразование 4 начальных столбцов, также в версию MultiIndex, но на этот раз добавленным уровнем является уровень second , содержащий только пустые строки:
wrk2 = df.iloc[:, 0:4]
wrk2.columns = pd.MultiIndex.from_product([wrk2.columns, ['']])
И последнее, что нужно сделать, это связать оба wrk DataFrames (в индексе):
result = wrk2.join(wrk1)
Или, если вы хотите более короткий код, не создавайте wrk1 (достаточно d ) и поместите соответствующее выражение в окончательную инструкцию:
result = wrk.join(pd.concat(d, axis=1, keys=d.keys()))
Примечание : json_normalize
, предложенное в другое решение, несомненно, короче, но результат имеет индекс столбца plain (одноуровневый). Как я понял, вам нужно просто MultiIndex для столбцов.