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

如何在Python DataFrame中高效插入小计行?含两种场景需求

高效实现DataFrame插入小计行的两种方案

一、每3行插入小计行

你之前用循环逐行插入的方式效率较低,推荐用矢量化分组+合并排序的方案,全程用pandas内置操作,避免逐行迭代:

实现步骤

  1. 给原数据添加分组标识,按每3行一组划分
  2. 生成每组的小计行(自定义显示内容)
  3. 合并原数据与小计行,通过排序键让小计行落在对应组的末尾

示例代码

import pandas as pd

# 示例数据(替换为你的Personnel DataFrame)
data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank', 'Grace', 'Henry', 'Ivy'],
    'Country': ['US', 'CA', 'UK', 'US', 'CA', 'UK', 'US', 'CA', 'UK'],
    'Salary': [5000, 6000, 7000, 5500, 6500, 7500, 5200, 6200, 7200]
}
personnel_df = pd.DataFrame(data)

# 1. 添加每3行一组的分组键
personnel_df['group'] = personnel_df.index // 3

# 2. 生成小计行:自定义列的聚合逻辑
subtotals = personnel_df.groupby('group').agg(
    Name=('Name', lambda x: 'Subtotal'),  # 小计行的Name列显示Subtotal
    Country=('Country', lambda x: ''),    # Country列留空
    Salary=('Salary', 'sum')              # 薪资列求和
).reset_index()

# 3. 合并原数据与小计行,添加排序键让小计行在组的最后
combined = pd.concat([personnel_df, subtotals]).drop('group', axis=1)
combined['sort_key'] = combined.index + (combined['Name'] == 'Subtotal') * 0.5

# 排序后重置索引,得到最终结果
final_df = combined.sort_values('sort_key').drop('sort_key', axis=1).reset_index(drop=True)
print(final_df)

二、按Country分组插入小计行

如果要按Country分组并在每组末尾插入小计,同样用分组聚合+合并排序的思路,核心是给每组设置唯一的排序标识:

示例代码

# 1. 按Country生成小计行,自定义显示内容
country_subtotals = personnel_df.groupby('Country').agg(
    Name=('Name', lambda x: f'Subtotal - {x.name}'),  # 显示分组名称的小计
    Country=('Country', lambda x: ''),
    Salary=('Salary', 'sum')
).reset_index(drop=True)

# 2. 添加排序键:让同一Country的原数据排在前面,小计行排在后面
personnel_df['sort_key'] = personnel_df['Country'] + '_' + personnel_df.index.astype(str)
country_subtotals['sort_key'] = country_subtotals['Name'].str.replace('Subtotal - ', '') + '_9999'

# 3. 合并并排序,得到最终结果
final_country_df = pd.concat([personnel_df, country_subtotals]).sort_values('sort_key').drop('sort_key', axis=1).reset_index(drop=True)
print(final_country_df)

为什么这种方法高效?

pandas的groupby、concat、sort_values都是底层优化的矢量化操作,相比逐行循环的iterrows,在数据量较大时(比如万行以上)性能会提升几十甚至上百倍,同时代码更简洁易维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 17:48:15