Я почти уверен, что есть более эффективные / элегантные способы, но это должно сработать
def split_elements(s):
elements = s[s.find('(')+1:-1].split(',')
key = s[:s.find('(')]
return ['{} ({})'.format(key, el) for el in elements]
input_data = {'values': ['Free (A+,BH,CA) 0.1¢/kg (AX)', 'Free (MA, MX,OM)', 'Free (BH,CA) 1.70% (P) 7% (PE) 12.3% (KR)'], 'ids': [100.3, 200.1, 321.5]}
df = pd.DataFrame(input_data)
temp_values = []
temp_ids = []
# iterate through rows
for idr, r in df.iterrows():
# extract elements
elements = [el.strip()+')' for el in r['values'].split(')') if el != '']
# split subelements
for element in elements:
split_el = split_elements(element)
temp_values.extend(split_el)
temp_ids.extend([r['ids']]*len(split_el))
# create dataset
df1 = pd.DataFrame({'ids': temp_ids, 'values': temp_values})
df1.set_index('ids')
Что дает
ids values
100.3 Free (A+)
100.3 Free (BH)
100.3 Free (CA)
100.3 0.1¢/kg (AX)
200.1 Free (MA)
200.1 Free ( MX)
200.1 Free (OM)
321.5 Free (BH)
321.5 Free (CA)
321.5 1.70% (P)
321.5 7% (PE)
321.5 12.3% (KR)