DataFrame处理战争死亡数据时出现数值拼接错误与科学计数法问题
死亡人数处理后数值异常的原因与修复
问题场景
我有一个记录战争、战争持续时间和死亡人数的DataFrame,为提取纯数字字符串,替换了"+"和","等符号后转为数值类型,使用的函数如下:
def death_range(df): df["death_range"] = df["death_range"].str.replace(",","") df["death_base"] = df["death_range"].str.split("–").str[0] df["death_max"] = df["death_range"].str.split("–").str[-1] df["death_base"] = df["death_base"].str.replace("+"," ") df["death_base"] = df["death_base"].str.replace(r"\D","", regex=True) df["death_max"] = df["death_max"].str.replace("+"," ") df["death_max"] = df["death_max"].str.replace(r"\D","", regex=True) df["death_base"] = pd.to_numeric(df["death_base"], errors='coerce') df["death_max"] = pd.to_numeric(df["death_max"], errors='coerce') return df
执行df_cp['death_max'].max()查看最致命战争的最大死亡人数,得到结果1700000040000000.0;定位对应战争后发现,原死亡范围为正确的17000000-40000000,但处理后却变成了1.700000e+15(即1700000040000000.0)。
问题原因
- 分割符不匹配:函数中使用的分割符是全角长破折号
–,但原数据里的范围分隔符是半角短横线-,导致str.split()没有将字符串拆分成两部分,death_max取到的是完整的17000000-40000000字符串。 - 非数字替换导致数值拼接:后续用
str.replace(r"\D","", regex=True)移除所有非数字字符(包括分隔符-),直接把两个数字拼接成了1700000040000000,转成数值后就出现了异常大的结果。
修复方案
调整分割符匹配逻辑,同时优化处理流程,兼容半角/全角分隔符,避免重复操作:
import pandas as pd def death_range(df): # 统一处理逗号和加号,保留数字与分隔符 df["death_range"] = df["death_range"].str.replace(",", "").str.replace("+", "") # 用正则同时匹配半角短横线和全角破折号,拆分出上下限并直接生成两列 df[["death_base", "death_max"]] = df["death_range"].str.split(r"[-–]", expand=True) # 提取纯数字,清理残留的非数字字符 df["death_base"] = df["death_base"].str.replace(r"\D", "", regex=True) df["death_max"] = df["death_max"].str.replace(r"\D", "", regex=True) # 转为数值类型,无法转换的设为NaN df["death_base"] = pd.to_numeric(df["death_base"], errors='coerce') df["death_max"] = pd.to_numeric(df["death_max"], errors='coerce') return df
优化点说明
- 提前统一处理逗号和加号,减少重复的字符串替换操作
- 使用正则
r"[-–]"同时匹配两种分隔符,兼容不同格式的原始数据 - 用
expand=True直接将拆分结果转为两列,代码更简洁直观
内容的提问来源于stack exchange,提问作者S.H
相关产品推荐
相关产品推荐

