我有一个可以通过以下代码生成的 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
请建议我应该在这里做什么。
最佳答案
您可以使用
r'(?i)\b(\d+(?:\.\d+)?)\s*(cl|ml|ltr|L)\b'
见 regex demo .
详情
(?i)
- \b
- 一个词边界(\d+(?:\.\d+)?)
- 捕获组 1:一个或多个数字后跟一个点和一个或多个数字的可选序列 \s*
- 0+ 个空格 (cl|ml|ltr|L)
- cl
, ml
, ltr
或 L
(注意不区分大小写的匹配)\b
- 一个词边界测试:
>>> ser.str.extract(r'(?i)\b(\d+(?:\.\d+)?)\s*(cl|ml|ltr|L)\b', expand=True)
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
关于python - 从 Pandas 系列中提取体积信息 - Pandas , Regex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61041224/