如何在Pandas中提取特定字符串关联数字并精简代码?
解决方案:从Pandas文本字段提取指定数字
需求说明
需要从DataFrame的description字段中提取两类数字:
- 所有位于
шт、мл之前的数字(支持无空格如100шт、带空格+逗号小数如6,4 кг等格式) - 仅保留
вес:之后对应кг前的数字(排除其他位置的кг相关数字)
实现代码
import pandas as pd import re # 原始DataFrame df = pd.DataFrame( columns=["description"], data=[ [ "пластилин скульптурный гамма , торг.марк-гамма. производитель-ооо россия. всего: по 1 кг, 100шт. в 20 кор. - вес: 96,9 кг 20 кор.на.поддоне 000 1 02" ], [ "ел текстильныйtextile chalk, 3500 шт - вес: 6,4 кг, ; 2)1 коробки, ; 3) № конт.:dryu9183029, кол-во:1;" ], [ "арт. 049231; точилка для карандашей (connect pastel 2h)pencil sharpener connect pastel 2h - 3200 шт.; произв.: good rise precision - вес: 114 кг, ; 2)10 коробок, ; 3) № конт.:mofu0672448(часть), кол-во:1;" ], [ "пластилин скульптурный гамма , торг.марк-гамма. производитель-ооо россия. всего: по 1 кг, 100шт. в 20 кор. - вес: 96,9 кг 20 по 1000шт кор.на.поддоне 000 1 02" ], ], ) # 构建正则表达式:匹配两类目标数字 regex = r'вес:\s*(\d+(?:,\d+)?)\s*кг|(\d+(?:,\d+)?)\s*(шт|мл)' # 提取所有匹配的数字,过滤空值并整理为列表 df['extracted_numbers'] = df['description'].apply( lambda x: [num for num in re.findall(regex, x) if num != ('', '', '')] ) # 进一步整理:把元组中的有效数字提取出来 df['extracted_numbers'] = df['extracted_numbers'].apply( lambda lst: [item[0] if item[0] else item[1] for item in lst] ) print(df['extracted_numbers'])
代码说明
- 正则表达式解析:
вес:\s*(\d+(?:,\d+)?)\s*кг:精准匹配вес:后紧跟的数字(支持整数和逗号小数格式),前后允许任意空格(\d+(?:,\d+)?)\s*(шт|мл):匹配шт或мл前的数字,兼容有无空格的格式- 用
|合并两个模式,实现一次扫描匹配所有目标内容
- 高效处理:结合
re.findall与Pandas的apply方法,逻辑精简,适合大数据量场景 - 结果整理:过滤正则匹配产生的空值,将元组中的有效数字提取为纯列表格式
输出结果
0 ['96,9', '100'] 1 ['6,4', '3500'] 2 ['114', '3200'] 3 ['96,9', '100', '1000'] Name: extracted_numbers, dtype: object
内容的提问来源于stack exchange,提问作者Madina
相关产品推荐
相关产品推荐

