You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 23:15:02