Python pandas拆分单列拼接值生成多列时金额小数丢失问题求解
问题原因
你之前的拆分逻辑出错核心是正则写法不符合预期:
- 正则中
.是通配符,默认匹配任意单个字符,你写的.实际匹配规则是「空格+任意字符」,而非你需要的「空格+英文句号」,因此会误切金额里的小数点,导致小数部分丢失 - 拆分规则没有覆盖
Booked Date和日期值之间是空格、而非冒号的特殊情况,也没兼容分隔符前后多余的空格,进一步导致取值错位
解决方案
针对这种固定键名的拼接字段,不推荐用split拆分——split对数据格式一致性要求极高,只要单条数据缺字段、多空格就会出现整列错位。更稳妥的方式是用str.extract()按字段名做正则捕获,直接提取对应值,不会出现错位问题:
import re import pandas as pd # 编写带命名捕获组的正则,兼容多余空格、两种分隔符场景 extract_pattern = r""" Order\s*ID:(?P<Order ID>.*?)\s*\. .*?Record\s*ID:(?P<Record ID>.*?)\s*\. .*?Type:(?P<Type>.*?)\s*\. .*?Amount:(?P<Amount>.*?)\s*\. .*?Booked\s*Date\s+(?P<Booked Date>.*) """ # 提取字段后和原DF拼接,保留原Details列 df = pd.concat([ df, df["Details"].str.extract(extract_pattern, flags=re.VERBOSE) ], axis=1) # 可选:字段类型转换 df["Amount"] = df["Amount"].astype(float) df["Booked Date"] = pd.to_datetime(df["Booked Date"]).dt.date
执行后即可得到你预期的结果:
- 原
Details列完整保留 - 拆分出的
Order ID/Record ID/Type/Amount/Booked Date取值完全匹配,Amount字段会完整保留小数位,Booked Date完整保留日期值 - 自动兼容分隔符前后的冗余空格,不需要额外做字符串清理
如果一定要使用split方法,需要将分隔符正则修正为
r"\s*\.\s*|:\s*|\s+(?=\d{4}-\d{2}-\d{2})",但该方法容错率极低,不推荐在生产场景使用。
内容的提问来源于stack exchange,提问作者Atef Syed
相关产品推荐
相关产品推荐

