如何将DataFrame中各Model的Sum总计置于中间并添加对应最大Box值
实现方案
核心思路
先计算每个model的sum总计值与最大box数值,再定位每个model的中间行进行值替换,全程用Pandas分组操作保证处理效率。
完整代码
import pandas as pd # 初始化原始数据 df = pd.DataFrame({ 'model': ['A','A','A','A','A','A','B','B','B','B'], 'lot': ['aa','ab','ac','ad','ae','af','ba','bb','bc','bd'], 'box': [1,1,2,2,2,3,1,2,2,2], 'qty': [0.2,0.1,0.4,0.5,0.1,0.2,0.6,0.3,0.2,0.4], 'sum': [0.3,"",1.0,"","",0.2,0.6,0.9,"",""] }) # 1. 处理sum列:空字符串转NaN,方便数值计算 df['sum'] = pd.to_numeric(df['sum'], errors='coerce') # 2. 按model分组计算关键指标:sum总计、最大box model_metrics = df.groupby('model').agg( total_sum=('sum', 'sum'), max_box=('box', 'max') ).assign(max_box=lambda x: x['max_box'].astype(str)) # 转字符串匹配lot列类型 # 3. 分组处理每个model的中间行 def update_mid_row(group): row_count = len(group) mid_pos = row_count // 2 # 取组内中间行的位置 # 替换中间行的lot和sum group.iloc[mid_pos, group.columns.get_loc('lot')] = model_metrics.loc[group.name, 'max_box'] group.iloc[mid_pos, group.columns.get_loc('sum')] = model_metrics.loc[group.name, 'total_sum'] return group # 应用分组处理并得到结果 final_df = df.groupby('model', group_keys=False).apply(update_mid_row) # 可选:将sum列的NaN转回空字符串,还原原始格式 final_df['sum'] = final_df['sum'].fillna('').astype(str) print(final_df)
关键步骤说明
- 预处理
sum列是为了避免空字符串干扰数值求和,后续可按需转回原格式 - 用
groupby.agg一次性计算两个指标,比多次分组操作更高效 - 通过组内索引定位中间行,确保每个model的修改位置精准匹配需求
内容的提问来源于stack exchange,提问作者ghost_like
相关产品推荐
相关产品推荐

