Pandas按索引补全缺失行并保持指定顺序的实现问题
实现代码
你可以通过groupby分组处理每个索引组,直接向缺少c行的分组末尾追加记录即可,原有分组的a、b顺序下追加的c行自然在b之后:
import pandas as pd # 原始DataFrame df = pd.DataFrame({'level_0':[0,0,0,1,1,2,2,2,3,3],'name':['a','b','c','a','b','a','b','c','a','b'],'value':[1,2,3,1,2,1,2,3,1,2]}) df.set_index('level_0', inplace=True) def fill_missing_c(group): # 检查当前分组是否存在name为c的记录 if 'c' not in group['name'].values: # 构造要插入的c行,索引继承当前分组的level_0值 insert_row = pd.DataFrame({'name': ['c'], 'value': [3]}, index=[group.index[0]]) group = pd.concat([group, insert_row], ignore_index=False) return group # 按level_0索引分组应用处理逻辑,group_keys=False避免新增多余索引层级 df = df.groupby(level='level_0', group_keys=False).apply(fill_missing_c) print(df)
兜底排序方案
如果你的原始数据可能存在分组内a、b顺序错乱的情况,可以加自定义排序逻辑保证c永远在b之后:
def fill_missing_c(group): if 'c' not in group['name'].values: insert_row = pd.DataFrame({'name': ['c'], 'value': [3]}, index=[group.index[0]]) group = pd.concat([group, insert_row], ignore_index=False) # 按name自定义排序,保证a<b<c的固定顺序 sort_rule = {'a': 1, 'b': 2, 'c': 3} group = group.sort_values(by='name', key=lambda x: x.map(sort_rule)) return group
运行上述代码后输出结果和你给出的期望结果完全一致。
内容的提问来源于stack exchange,提问作者Dance Party
相关产品推荐
相关产品推荐

