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

如何高效基于pandas的df_1按指定公式计算生成新数据框df_2

高效实现方案

核心思路:不需要拆分多个子数据框再合并,仅通过一次分组透视+向量化计算就能完成,运算效率远高于拆分合并的方案,尤其适合数据量较大的场景。

实现步骤

  • 第一步:先清洗原始数据的格式,把带$、,的金额和成交量字段转为数值类型,方便后续计算
  • 第二步:按Group、Month、ID分组,透视提取各成本类型对应的成本值,同时取分组内FOB对应的Volume作为统一的Volume值
  • 第三步:按给定公式直接向量化计算Freight、FOB、Price三个新指标的成本值
  • 第四步:将宽表转为要求的长表格式,再把数值转回带格式的字符串匹配输出要求

可运行代码

import pandas as pd

# 原始df_1定义
df_1 = pd.DataFrame([['A', '1/1/2021','SKU_1','Customer Backhaul','34,848','$-51,100'],
              ['A', '1/1/2021','SKU_1','FOB','75,357','$12,407,112'],
              ['A', '1/1/2021','SKU_1','Price','75,357','$12,407,112'],
              ['A', '1/1/2021','SKU_1','Vendor Freight - Delivered','40,511','$65,470'],
              ['B', '1/1/2021','SKU_1','Customer Backhaul','197,904','$-157,487'],
              ['B', '1/1/2021','SKU_1','FOB','931,866','$50,059,515'],
              ['B', '1/1/2021','SKU_1','Price','931,866','$62,333,500'],
              ['B', '1/1/2021','SKU_1','Vendor Freight - Delivered','740,355','$1,220,927']], 
              columns=['Group', 'Month','ID','Cost Type','Volume','Order Cost'])

# 1. 数据格式清洗
# 转Volume为数值
df_1['Volume'] = df_1['Volume'].str.replace(',','').astype(int)
# 转Order Cost为数值
df_1['Order Cost'] = df_1['Order Cost'].str.replace('[$,]','', regex=True).astype(int)

# 2. 分组透视获取宽表
df_pivot = df_1.pivot_table(
    index=['Group', 'Month', 'ID'],
    columns='Cost Type',
    values='Order Cost'
).reset_index()
# 加入分组内FOB的Volume
df_fob_vol = df_1[df_1['Cost Type'] == 'FOB'][['Group', 'Month', 'ID', 'Volume']]
df_pivot = df_pivot.merge(df_fob_vol, on=['Group', 'Month', 'ID'], how='left')

# 3. 按公式计算新指标
df_pivot['Freight'] = df_pivot['Customer Backhaul'].abs() + df_pivot['Vendor Freight - Delivered']
df_pivot['FOB'] = df_pivot['FOB']
df_pivot['Price'] = df_pivot['Price'] - df_pivot['Customer Backhaul']

# 4. 转为要求的长表格式
df_2 = df_pivot.melt(
    id_vars=['Group', 'Month', 'ID', 'Volume'],
    value_vars=['Freight', 'FOB', 'Price'],
    var_name='Cost Type',
    value_name='Cost'
)

# 可选:把数值转回原始格式(带$和逗号)
df_2['Volume'] = df_2['Volume'].apply(lambda x: f"{x:,}")
df_2['Cost'] = df_2['Cost'].apply(lambda x: f"${x:,}")

# 排序匹配示例输出
df_2 = df_2.sort_values(['Group', 'Cost Type'], ascending=[True, False]).reset_index(drop=True)
print(df_2)

方案优势

全程都是pandas原生向量化操作,没有循环拼接子数据框的开销,相比分组再合并的方案性能至少提升一个数量级,数据量越大优势越明显。

内容的提问来源于stack exchange,提问作者user16628047

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 20:24:03