У меня есть серия Pandas, которую можно получить с помощью следующего кода:
Ввод:
l = ['abcd 1942 Lmauu 40% 70cl',
'something again something 1.5 L',
'some other stuff 45% 70 CL',
'not the exact data 3LTR',
'abcd 100Ltud 6%(8)500ML',
'cdef 6%(8)500 ml',
'a packet 24 x 27.5 cl ( PET )']
ser = pd.Series(l)
Постановка проблемы и ожидаемый результат:
Я пытаюсь извлечь тома из ряда и преобразовать их в кадр данных таким образом, чтобы объем находился в 1 столбце кадра данных, а единица измерения в другой столбец, ожидаемый результат может быть воспроизведен с использованием приведенного ниже кода:
d = {0: {0: '70',
1: '1.5',
2: '70',
3: '3',
4: '500',
5: '500',
6: '27.5'},
1: {0: 'cl', 1: 'L', 2: 'CL', 3: 'LTR', 4: 'ML', 5: 'ml', 6: 'cl'}}
expected_output = pd.DataFrame(d)
0 1
0 70 cl
1 1.5 L
2 70 CL
3 3 LTR
4 500 ML
5 500 ml
6 27.5 cl
Мой пробный код
Вот что я пробовал, я пришел очень близко к тому, что я хочу, но не совсем, если вы видите, я не получаю последний том. Я думаю, потому что я включил $
в свое регулярное выражение, но без него я не смог бы проанализировать объем, как в этой строке, например, abcd 1942 Lmauu 40% 70cl
, 1942 L
были бы возвращены. Также мне нужна единица измерения только во втором столбце, а не в первом, как показано в моих выходных данных, но это вторично.
print(ser.str.extract(r'((?i)([\d]+?[.])?\d+?[\s+]?(cl$|ml$|ltr$|L$)(?:$))').iloc[:,[0,-1]])
0 2
0 70cl cl
1 1.5 L L
2 70 CL CL
3 3LTR LTR
4 500ML ML
5 500 ml ml
6 NaN NaN
Пожалуйста, предложите, что мне делать здесь.