python - 从 pandas 系列中提取卷信息 - Pandas , Regex
问题描述
我有一个可以通过以下代码生成的 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'
请参阅正则表达式演示。
细节
(?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
推荐阅读
- javascript - 如何用三元运算符重构它?
- ios - UITableView 的 reloadData 更改约束
- angular - 离子谷歌地图标记JSON不显示
- powershell - Google Identity Platform:使用 Firebase Admin SDK 私钥在 Powershell 中使用 OAuth 2.0
- css - 禁用提交按钮悬停效果
- c++ - QWidget::winId() 返回值在运行时变化的细节
- android - 无法从最终 FirebaseInstanceIdReceiver 继承
- javascript - 为什么这个全局变量不起作用?它可以完美地用作局部变量
- r - R根据分组计数结果将产品类型分配给用户
- javascript - 使用相同的 onClick 按钮将计数器递增到 2(范围 0-2),然后从 2 递减回 0