如何对齐DataFrame中不同起止年份的DRG数据列?
解决DRG数据年份列对齐与数据覆盖问题
一、先解决“仅保留最后一项数据”的问题
你当前的问题核心是每次爬取单个DRG组数据后直接覆盖了之前的DataFrame,导致最终只留存最后一组数据。解决思路是先批量收集所有DRG组的DataFrame,再统一处理:
- 初始化空列表存储每组数据:
import pandas as pd # 存储所有DRG组数据的容器 drg_data_list = [] # 伪代码:你的DRG组爬取循环 for drg_code in target_drg_groups: # 爬取当前DRG组数据并转换为DataFrame(需确保df包含DRG标识列和年份列) df = fetch_drg_data(drg_code) # 将当前组数据加入列表,避免覆盖 drg_data_list.append(df)
二、对齐不同DRG组的年份列
不同DRG组的年份范围存在差异,需先整理出所有出现过的年份,再将每个DRG组的DataFrame按统一年份列重新索引:
- 提取所有出现过的年份:
# 遍历所有DataFrame,收集所有年份列(假设年份列是'2014'、'2015'这类数字格式) all_years = set() for df in drg_data_list: # 筛选年份列(非年份列假设只有DRG标识,比如'drg_code',可根据实际调整) year_cols = [col for col in df.columns if str(col).isdigit()] all_years.update(year_cols) # 排序得到有序的年份列列表 all_years = sorted(all_years) - 对每个DRG组的DataFrame做列对齐:
aligned_dfs = [] for df in drg_data_list: # 保留DRG标识列,补充缺失的年份列,缺失值用NaN填充 aligned_df = df.reindex(columns=['drg_code'] + all_years) aligned_dfs.append(aligned_df) - 合并所有对齐后的DataFrame:
final_aligned_df = pd.concat(aligned_dfs, ignore_index=True)
三、输出到Excel(多工作表)和CSV
- 输出CSV:
final_aligned_df.to_csv('drg_aligned_data.csv', index=False, encoding='utf-8-sig') - 输出多工作表Excel:
with pd.ExcelWriter('drg_aligned_data.xlsx') as writer: # 工作表1:完整对齐数据 final_aligned_df.to_excel(writer, sheet_name='完整对齐数据', index=False) # 工作表2:DRG分组统计(示例) drg_summary = final_aligned_df.groupby('drg_code').sum(numeric_only=True) drg_summary.to_excel(writer, sheet_name='DRG分组统计') # 工作表3:年度数据汇总(示例) year_summary = final_aligned_df[all_years].sum().to_frame('年度总量').T year_summary.to_excel(writer, sheet_name='年份汇总')
额外适配说明
- 如果年份列是带后缀的格式(比如'2014年'),可以用正则提取年份:
import re year_cols = [re.findall(r'\d{4}', col)[0] for col in df.columns if re.search(r'\d{4}', col)] - 缺失值可根据业务需求填充为0、空字符串等,用
aligned_df.fillna(0, inplace=True)即可。
内容的提问来源于stack exchange,提问作者Michael Wiz
相关产品推荐
相关产品推荐

