如何按Name分组补全数据表缺失Stage行并填充0分
按Name分组补全缺失Stage行并设置Score为0的实现方案
需求说明:按Name分组,为每个Name补全所有缺失的Stage行,缺失行的Score字段设置为0。
原始数据表
| Stage | ID | Name | Score |
|---|---|---|---|
| stage 1 | 234 | name1 | 10 |
| Stage 2 | 234 | name1 | 10 |
| Stage 3 | 234 | name1 | 10 |
| Stage 4 | 234 | name1 | 20 |
| Stage 6 | 234 | name1 | 5 |
| Stage 7 | 234 | name1 | 10 |
| Stage 1 | 200 | name2 | 20 |
| Stage 3 | 200 | name2 | 20 |
| Stage 4 | 200 | name2 | 20 |
| Stage 5 | 200 | name2 | 20 |
| Stage 6 | 200 | name2 | 20 |
| Stage 7 | 200 | name2 | 20 |
| Stage 1 | 101 | name3 | 10 |
| Stage 2 | 101 | name3 | 10 |
| Stage 3 | 101 | name3 | 10 |
| Stage 4 | 101 | name3 | 10 |
| Stage 5 | 101 | name3 | 10 |
| Stage 6 | 101 | name3 | 10 |
| Stage 7 | 101 | name3 | 10 |
| Stage 3 | 300 | name4 | 20 |
处理后期望数据表
| Stage | ID | Name | Score |
|---|---|---|---|
| stage 1 | 234 | name1 | 10 |
| Stage 2 | 234 | name1 | 10 |
| Stage 3 | 234 | name1 | 10 |
| Stage 4 | 234 | name1 | 20 |
| Stage 5 | 234 | name1 | 0 |
| Stage 6 | 234 | name1 | 5 |
| Stage 7 | 234 | name1 | 10 |
| Stage 1 | 200 | name2 | 20 |
| Stage 2 | 200 | name2 | 0 |
| Stage 3 | 200 | name2 | 20 |
| Stage 4 | 200 | name2 | 20 |
| Stage 5 | 200 | name2 | 20 |
| Stage 6 | 200 | name2 | 20 |
| Stage 7 | 200 | name2 | 20 |
| Stage 1 | 101 | name3 | 10 |
| Stage 2 | 101 | name3 | 10 |
| Stage 3 | 101 | name3 | 10 |
| Stage 4 | 101 | name3 | 10 |
| Stage 5 | 101 | name3 | 10 |
| Stage 6 | 101 | name3 | 10 |
| Stage 7 | 101 | name3 | 10 |
| Stage 1 | 300 | name4 | 0 |
| Stage 2 | 300 | name4 | 0 |
| Stage 3 | 300 | name4 | 10 |
| Stage 4 | 300 | name4 | 0 |
| Stage 5 | 300 | name4 | 0 |
| Stage 6 | 300 | name4 | 0 |
| Stage 7 | 300 | name4 | 0 |
实现方案
方法1:SQL实现
核心思路是先生成Name与Stage的全量组合,再左连接原始表,用COALESCE将缺失的Score替换为0:
WITH all_stages AS ( -- 获取所有唯一Stage SELECT DISTINCT Stage FROM your_table ), all_names AS ( -- 获取所有Name及其对应的唯一ID SELECT DISTINCT Name, ID FROM your_table ) SELECT s.Stage, n.ID, n.Name, COALESCE(t.Score, 0) AS Score FROM all_names n -- 生成Name与Stage的全量笛卡尔积 CROSS JOIN all_stages s -- 左连接原始表匹配已有数据 LEFT JOIN your_table t ON n.Name = t.Name AND s.Stage = t.Stage -- 按Name和Stage排序 ORDER BY n.Name, s.Stage;
方法2:Python Pandas实现
核心思路是构造Name与Stage的全量组合,合并原始数据后填充缺失值:
import pandas as pd # 构造原始数据(实际场景可从文件/数据库读取) df = pd.DataFrame({ 'Stage': ['stage 1', 'Stage 2', 'Stage 3', 'Stage 4', 'Stage 6', 'Stage 7', 'Stage 1', 'Stage 3', 'Stage 4', 'Stage 5', 'Stage 6', 'Stage 7', 'Stage 1', 'Stage 2', 'Stage 3', 'Stage 4', 'Stage 5', 'Stage 6', 'Stage 7', 'Stage 3'], 'ID': [234]*6 + [200]*6 + [101]*7 + [300], 'Name': ['name1']*6 + ['name2']*6 + ['name3']*7 + ['name4'], 'Score': [10,10,10,20,5,10,20,20,20,20,20,20,10,10,10,10,10,10,10,20] }) # 获取所有唯一Stage和Name-ID映射关系 all_stages = df['Stage'].unique() name_id_map = df[['Name', 'ID']].drop_duplicates().set_index('Name')['ID'].to_dict() # 生成Name与Stage的全量组合 full_combinations = [] for name in name_id_map.keys(): for stage in all_stages: full_combinations.append({'Stage': stage, 'Name': name, 'ID': name_id_map[name]}) full_df = pd.DataFrame(full_combinations) # 合并原始数据,填充缺失的Score为0 result_df = full_df.merge(df, on=['Stage', 'ID', 'Name'], how='left') result_df['Score'] = result_df['Score'].fillna(0).astype(int) # 按Name和Stage排序 result_df = result_df.sort_values(by=['Name', 'Stage']).reset_index(drop=True) print(result_df)
内容的提问来源于stack exchange,提问作者jarheadtx
相关产品推荐
相关产品推荐

