Pandas按分组条件为col_name列缺少C、D值的分组新增对应行方法
按name分组补全col_name为C/D缺失行的实现方案
核心思路是先生成所有name必须包含的C、D行模板,和所有唯一name做笛卡尔积得到全量基准行,再和原表对比找出缺失的行,填充固定值后合并回原表即可,该方案兼容任意多的额外列。
完整实现代码
import pandas as pd # ---------------------- 示例原数据(可替换为你的实际DataFrame) ---------------------- df = pd.DataFrame({ 'owner': ['user1', 'user2', 'user1', 'user3'], 'name': ['group1', 'group1', 'group2', 'group3'], 'col_name': ['A', 'C', 'B', 'D'], 'test_col1': [1,2,3,4], 'test_col2': ['str1', 'str2', 'str3', 'str4'], 'extra_col1': [10, 20, 30, 40] # 模拟实际场景中的其他额外列 }) # ---------------------- 核心逻辑 ---------------------- # 1. 定义C、D补全行的固定字段值模板 fill_template = pd.DataFrame([ {'col_name': 'C', 'owner': 'svc', 'test_col1': 'remain_constant_3', 'test_col2': 'String13'}, {'col_name': 'D', 'owner': 'svc', 'test_col1': 'remain_constant_4', 'test_col2': 'String14'} ]) # 2. 获取所有唯一的分组name all_names = df[['name']].drop_duplicates() # 3. 生成每个name必须有的C/D基准行(笛卡尔积) # Pandas 1.2.0+ 支持how='cross' required_rows = all_names.merge(fill_template, how='cross') # 低版本Pandas兼容写法: # all_names['tmp'] = 1 # fill_template['tmp'] = 1 # required_rows = all_names.merge(fill_template, on='tmp').drop('tmp', axis=1) # 4. 匹配原表找出缺失的待补行 compare = required_rows.merge( df[['name', 'col_name']], on=['name', 'col_name'], how='left', indicator=True ) missing_rows = compare[compare['_merge'] == 'left_only'].drop('_merge', axis=1) # 5. 填充其余列,可按需自定义填充规则 for col in df.columns: if col not in missing_rows.columns: if pd.api.types.is_numeric_dtype(df[col]): missing_rows[col] = 0 # 数值列默认填0 elif pd.api.types.is_string_dtype(df[col]): missing_rows[col] = '' # 字符串列默认填空串 else: missing_rows[col] = pd.NA # 其他类型默认填空值 # 6. 合并原表和补全行,得到最终结果 final_df = pd.concat([df, missing_rows], ignore_index=True)
如果你的其他列有特殊填充规则,直接修改上述第5步的赋值逻辑即可,核心匹配逻辑不需要调整,新增列也会自动适配。
内容的提问来源于stack exchange,提问作者Vaibhav Borkar
相关产品推荐
相关产品推荐

