pandas处理DataFrame列混合格式字符串实现替换计算
pandas 多格式值列替换处理方案
问题场景
现有pandas DataFrame,其中Values列存在多种格式取值,原始样例数据如下:
| Name | Values |
|---|---|
| First | 5-9 |
| Second | 7 |
| Third | - |
| Fourth | 12-16 |
需要按以下规则处理Values列:
- 若值为
5-9、12-16这类数值区间格式字符串,替换为区间两端数值的平均值,例如5-9替换为7,12-16替换为14 - 若值为单个
-,替换为0 - 单个数字格式的值保持原数值不变
原有实现代码运行无法得到预期结果,错误代码如下:
if df["Value"].str.len() > 1: df["Value"] = df["Value"].str.split('-') df["Value"] = (df["Value"][0] + df["Value"][1]) / 2 elif df["Value"].str.len() == 1: df["Value"] = df["Value"].str.replace('-', 0)
代码核心问题:
- 对pandas Series直接使用原生
if/elif判断会触发真值歧义,因为长度判断返回的是整列布尔值,不是单个判断结果 - 拆分字符串后直接取
df["Value"][0]是取第一行的拆分结果,不是逐行取列表内元素 - 未做字符串到数值的类型转换,字符串相加会得到拼接结果,无法计算数值平均值
预期处理完成后的结果:
| Name | Values |
|---|---|
| First | 7 |
| Second | 7 |
| Third | 0 |
| Fourth | 14 |
实现代码
写法1:逐行apply(逻辑清晰,适合中小数据量)
自定义单值处理函数,逐行应用到列即可,逻辑直观易维护:
import pandas as pd # 构造样例数据 df = pd.DataFrame({ "Name": ["First", "Second", "Third", "Fourth"], "Values": ["5-9", "7", "-", "12-16"] }) def parse_value(val): # 处理横杠占位符 if val == "-": return 0 # 处理数值区间 if "-" in val: num1, num2 = val.split("-") return (int(num1) + int(num2)) / 2 # 处理普通单个数字 return int(val) df["Values"] = df["Values"].apply(parse_value)
写法2:向量化操作(性能更高,适合大数据量)
用pandas内置向量化方法实现,避免逐行循环开销:
# 先替换单独的横杠占位符 df["Values"] = df["Values"].replace("-", 0) # 拆分区间为两列 split_cols = df["Values"].str.split("-", expand=True) # 标记所有区间格式的行 range_mask = split_cols[1].notna() # 计算区间平均值赋值 df.loc[range_mask, "Values"] = (split_cols.loc[range_mask, 0].astype(int) + split_cols.loc[range_mask, 1].astype(int)) / 2 # 统一转换数值类型 df["Values"] = df["Values"].astype(int)
两种写法运行后都能得到符合预期的结果。
内容的提问来源于stack exchange,提问作者soy_elparce
相关产品推荐
相关产品推荐

