如何在Pandas列表的DataFrame中按条件添加行?
为Pandas DataFrame按条件补全行的解决方案
可行实现代码
直接使用以下完善后的函数即可实现需求:
import pandas as pd def add_rows(df, max_mon, res): # 获取当前DataFrame的固定ID(假设每个DF内ID统一) fixed_id = df['ID'].iloc[0] # 生成从0到max_mon、步长为res的完整月份序列 full_months = pd.DataFrame({'month': range(0, max_mon + res, res)}) # 初始化完整数据:固定ID,num设为NaN full_months['ID'] = fixed_id full_months['num'] = pd.NA # 合并原数据,保留已有的num值 merged = full_months.merge(df[['month', 'num']], on='month', how='left', suffixes=('', '_orig')) # 用原数据的num值填充,其余保持NaN merged['num'] = merged['num_orig'].combine_first(merged['num']) # 整理结果:保留目标列,按month排序 return merged[['ID', 'month', 'num']].sort_values('month').reset_index(drop=True) # 批量处理列表中的DataFrame final = [add_rows(df, df['month'].max(), 3) for df in this]
需求回顾
需要处理多个DataFrame组成的列表,每个DF的补全规则:
- ID保持固定不变
- month从0开始按指定增量(如3)递增,覆盖到原DF的最大month值
- 已存在的月份保留原
num值,新增月份的num设为NaN
比如原第二个DF补全后会包含month=3、9、15等缺失月份,对应num为NaN。
代码逻辑解释
- 获取固定ID:取DF的第一个ID值(假设每个DF内ID完全一致)
- 生成完整月份序列:用
range生成从0到最大month的所有间隔为res的月份,确保没有遗漏 - 初始化完整数据集:创建包含所有月份的新DF,设置好固定ID和初始NaN的num列
- 合并填充数据:通过左合并将原DF的num值匹配到对应月份,
combine_first自动保留原数据、补全缺失值 - 整理输出:删除合并产生的冗余列,按month排序后返回
测试效果
以测试数据中的tempo2为例,执行后输出的前7行如下:
ID month num 0 6 0 5.0 1 6 3 NaN 2 6 6 4.0 3 6 9 NaN 4 6 12 3.0 5 6 15 NaN 6 6 18 2.0
内容的提问来源于stack exchange,提问作者reksapj
相关产品推荐
相关产品推荐

