Pandas按客户分组将DataFrame价格列统一为相同小数位数的实现方法
按客户ID统一价格列小数位数的高效Pandas实现
实现思路
- 首先筛选所有需要处理的价格列,排除后缀带qty的数量列
- 定义小数位数计算逻辑,空值跳过计算,避免浮点数精度误差干扰统计结果
- 按
CustId对数据集分组,每组内统计所有价格值的最大小数位数 - 对组内所有价格列按该最大位数格式化,空值保持原有状态不变
实现代码
import pandas as pd import numpy as np # 1. 筛选价格列(所有Price_开头且不含qty的列) price_cols = [col for col in df.columns if col.startswith('Price_') and 'qty' not in col] # 2. 定义小数位数计算函数 def count_decimal(x): if pd.isna(x): return 0 # 转字符串后去除末尾无效0,避免315.1200被统计为4位小数 str_x = str(x).rstrip('0') return len(str_x.split('.')[1]) if '.' in str_x else 0 # 3. 定义分组处理函数 def format_group_prices(group): # 计算当前客户所有价格值的最大小数位数 max_decimal = group[price_cols].applymap(count_decimal).max().max() # 格式化所有价格列,空值保留 for col in price_cols: group[col] = group[col].apply( lambda x: f"{x:.{max_decimal}f}" if pd.notna(x) else x ) return group # 4. 执行分组处理 df = df.groupby('CustId', group_keys=False).apply(format_group_prices)
性能说明
800余个客户ID属于极低数量的分组,Pandas的groupby底层为C语言优化实现,远快于Python层手动循环遍历每个客户ID的实现,即使是百万行级的数据集也可以快速处理完成。
场景适配说明
- 如果仅需要数值计算时保留对应精度,无需展示末尾补的0,可以把字符串格式化逻辑替换为
round(x, max_decimal),输出仍为数值类型 - 如果是给终端用户展示的场景,当前的字符串格式化可以固定显示末尾补的0,符合需求要求
内容的提问来源于stack exchange,提问作者rohi
相关产品推荐
相关产品推荐

