Если используется только один список элементов:
df['x2'] = df['x2'].str[0]
Или:
df['x2'] = df['x2'].apply(lambda x: x[0])
РЕДАКТИРОВАТЬ:
После комментариев в строках есть строки, поэтому необходимо: [ 116]
mask = df.iloc[0].astype(str).str.startswith('[')
df.loc[:, mask] = df.loc[:, mask].apply(lambda x: x.str.strip('[]')).astype(float)
Удивительный и забавный подход (для 3 кувшинов) через барицентрические координаты (действительно!), как описано при всегда блестящем Сокращении Узла веб-сайта: Барицентрические координаты: Любопытное Приложение.
Этот тип проблемы часто поддается методам динамического программирования. У меня есть ofetn, замеченный эта определенная проблема, используемая в качестве примера в курсах исследования операций. Одно хорошее пошаговое описание здесь.
Я бы предложил метод пространства поиска. Я создал программу для решения общих проблем с водяными кувшинами, используя BFS. Могу прислать вам, если хотите.