Pandas如何按字典补全DataFrame缺失等级行并填充对应计数值
解决方案
你可以按每组grade+count列单独构造后拼接,完整实现代码如下:
import pandas as pd import numpy as np # 原始数据定义 df = pd.DataFrame(data={'grade_1':['A','B','C'], 'grade_1_count': [19,28,32], 'grade_2': ['pass','fail',np.nan], 'grade_2_count': [39,18, np.nan]}) grade_dict = {'grade_1':['A','B','C','D','E','F'], 'grade_2' : ['pass','fail','not present', 'borderline']} # 计算最终DataFrame的总行数:取所有等级列表的最大长度 max_len = max(len(v) for v in grade_dict.values()) result = {} for grade_col, full_grades in grade_dict.items(): count_col = f"{grade_col}_count" # 构造 等级->计数 的映射字典 grade_to_count = dict(zip(df[grade_col].dropna(), df[count_col].dropna())) # 补全grade列:全量等级+后续补nan对齐最大长度 result[grade_col] = full_grades + [np.nan]*(max_len - len(full_grades)) # 补全count列:已有等级取对应值,新增等级填0,后续补nan对齐最大长度 count_values = [grade_to_count.get(g, 0) for g in full_grades] result[count_col] = count_values + [np.nan]*(max_len - len(full_grades)) # 生成最终DataFrame expected_df = pd.DataFrame(result) print(expected_df)
代码说明
- 先取所有等级列表的最长长度作为最终表的总行数,保证所有列长度一致
- 为每个grade列生成
等级→计数的映射,避免反复查找原表 - 新增的等级对应的count值统一填0,超过当前等级列表长度的位置统一填
np.nan,完全匹配需求 - 注:你给出的预期输出里
not preset为笔误,实际运行结果为not present,其余逻辑完全符合预期。
内容的提问来源于stack exchange,提问作者an10b3
相关产品推荐
相关产品推荐

