如何在Python DataFrame中高效插入小计行?含两种场景需求
高效实现DataFrame插入小计行的两种方案
一、每3行插入小计行
你之前用循环逐行插入的方式效率较低,推荐用矢量化分组+合并排序的方案,全程用pandas内置操作,避免逐行迭代:
实现步骤
- 给原数据添加分组标识,按每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
相关产品推荐
相关产品推荐

